skypager 0.0.3 → 0.0.4
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 +4 -4
- data/LICENSE.md +3 -0
- data/README.md +49 -0
- data/VISION.md +34 -0
- data/lib/skypager.rb +16 -0
- data/lib/skypager/build_server.rb +0 -17
- data/lib/skypager/dns.rb +4 -0
- data/lib/skypager/extension.rb +1 -8
- data/lib/skypager/proxy.rb +211 -0
- data/lib/skypager/router.rb +46 -0
- data/lib/skypager/site.rb +74 -9
- data/lib/skypager/sync/amazon.rb +1 -1
- data/lib/skypager/sync/folder.rb +1 -1
- data/lib/skypager/version.rb +1 -1
- data/skypager.gemspec +19 -17
- metadata +69 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd2176972c399bbfec3b8fde460f7592ecfca5a7
|
4
|
+
data.tar.gz: 08290cdac67c958f31a5e9ca96c2ede7a8827fd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 661f07c8c3beaaf3e466ba68e7fa432c6ec1d62852f02e4bf09762dd97b9db9edd1fd4c3101266462b07bae83097ddf90f7420f7b6fb7f64ccba350c7189e2df
|
7
|
+
data.tar.gz: 09c044b5e5cdc7554047ad4e1c0827619455edd9b7d9bfd58b8d513f174835ed6c97d67a19845a020d76607367b179197448f23076fc31396cc20c80ec739160
|
data/LICENSE.md
ADDED
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Automate all the boring things
|
2
|
+
|
3
|
+
Skypager is a set of tools and API integrations that aims to make
|
4
|
+
developing and deploying static HTML websites a blast. Static websites
|
5
|
+
are awesome, and perform far better than dynamically generated websites.
|
6
|
+
Especially when deployed to a CDN and cached.
|
7
|
+
|
8
|
+
A fast page load time is considered to be the single most important factor that effects
|
9
|
+
conversions.
|
10
|
+
|
11
|
+
Of course, people build dynamic websites because they need to be powered
|
12
|
+
by a Content Management System and a database, and supported by a version
|
13
|
+
control system, among many other completely valid reasons.
|
14
|
+
|
15
|
+
Nobody wants to hand code HTML pages, so we need some form of templates which we can fill with our own
|
16
|
+
data based on what URL the browser requests.
|
17
|
+
|
18
|
+
This is where Skypager comes in. Skypager is a system for reacting to
|
19
|
+
changes in a variety of data sources, file sharing APIs, or version control systems, and then
|
20
|
+
automatically triggering builds in your site build tool (Middleman, for
|
21
|
+
example.) Skypager then takes the static build, and deploys it to an Amazon S3
|
22
|
+
Bucket, and triggers expirations of your Cloudfront CDN or other Caches.
|
23
|
+
|
24
|
+
Skypager can automate setting up your S3 Buckets, Cloudfront CDNs, and
|
25
|
+
DNS configuration.
|
26
|
+
|
27
|
+
With Skypager, all of the following setups are possible:
|
28
|
+
|
29
|
+
- building a photographer website, and allowing the photographer to
|
30
|
+
store all of her galleries in a Dropbox folder. Every time they add a
|
31
|
+
new folder or a new file to the folder, Skypager regenerates the
|
32
|
+
static pages and pushes the assets to S3.
|
33
|
+
|
34
|
+
- building a product catalog website powered by a spreadsheet on Google
|
35
|
+
Drive. Any time your customer adds or edits a row in the spreadsheet,
|
36
|
+
Skypager generates the product page and deploys it for you.
|
37
|
+
|
38
|
+
- building a blog for your creative writer friend by giving them a
|
39
|
+
Dropbox folder to write markdown. Any time they edit the markdown, or
|
40
|
+
add a new one? you guessed it.
|
41
|
+
|
42
|
+
- Building a Single page javascript app powered by JSON API?
|
43
|
+
Do you want a static marketing site powered by data in your API or database? Having Rails
|
44
|
+
generate these pages on the fly and caching them it turns out can be a
|
45
|
+
terrible approach. Skypager can watch a REST endpoint in your app for
|
46
|
+
changes, or you can POST to the Skypager Build Server's Webhooks and
|
47
|
+
trigger a build on your own.
|
48
|
+
|
49
|
+
|
data/VISION.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Skypager
|
2
|
+
|
3
|
+
Skypager is a tool that automates the tasks needed to build and maintain
|
4
|
+
a static site that is deployed to Amazon S3, with or without a CDN that
|
5
|
+
has support for custom domains, ssl, etc
|
6
|
+
|
7
|
+
Example sites are included in the examples directory.
|
8
|
+
|
9
|
+
### Things this gem currently does well
|
10
|
+
|
11
|
+
- Support for build tools
|
12
|
+
- Currently just Middleman
|
13
|
+
|
14
|
+
- Integrates with:
|
15
|
+
- google drive
|
16
|
+
- dropbox
|
17
|
+
- dnsimple
|
18
|
+
- amazon cloud services (s3, cloudfront)
|
19
|
+
|
20
|
+
- Automate boring tasks for setting up static sites deployed to S3
|
21
|
+
- Setting up an s3 bucket
|
22
|
+
- Setting up a cloudfront CDN
|
23
|
+
- Setting up CNAME aliases for the s3 bucket
|
24
|
+
|
25
|
+
- Creates links between common file sharing, or version control systems
|
26
|
+
- Dropbox
|
27
|
+
- Google Drive
|
28
|
+
|
29
|
+
- Pulls down files from dropbox, or data from google drive, and incorporates it into the build
|
30
|
+
|
31
|
+
### Things this gem aims to do
|
32
|
+
|
33
|
+
- Create a build server which responds to events in Github, Dropbox, Google Drive, etc
|
34
|
+
- Allows for re-deploying sites on changes to Github, Dropbox, Google Drive
|
data/lib/skypager.rb
CHANGED
@@ -23,6 +23,22 @@ module Skypager
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
def self.router(app, options={})
|
27
|
+
@router ||= Skypager::Router.new(app, options)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.proxy(options={})
|
31
|
+
if options.is_a?(String)
|
32
|
+
options = {bucket: options}
|
33
|
+
end
|
34
|
+
|
35
|
+
require 'rack-proxy' unless defined?(Rack::Proxy)
|
36
|
+
require 'skypager/proxy' unless defined?(Skypager::Proxy)
|
37
|
+
|
38
|
+
@_proxies ||= {}
|
39
|
+
@_proxies[options.hash] ||= Skypager::Proxy.new(options)
|
40
|
+
end
|
41
|
+
|
26
42
|
def self.config
|
27
43
|
Skypager::Configuration.instance
|
28
44
|
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# The Skypager Build server provides REST endpoints which can be hit by
|
2
|
-
# external services, such as the Dropbox Webhooks system, Google Drive webhooks system,
|
3
|
-
# or the Github Webhook system, etc.
|
4
|
-
#
|
5
|
-
# Given a parameter from the Webhook request,
|
6
|
-
# the Build server will find the appropriate site,
|
7
|
-
# build and deploy it
|
8
|
-
|
9
|
-
require 'sinatra'
|
10
|
-
|
11
|
-
class Skypager::BuildServer < Sinatra::Base
|
12
|
-
post "/webhooks/:provider" do
|
13
|
-
end
|
14
|
-
|
15
|
-
post "/webhooks/:provider/:site_name" do
|
16
|
-
end
|
17
|
-
end
|
data/lib/skypager/dns.rb
CHANGED
data/lib/skypager/extension.rb
CHANGED
@@ -57,15 +57,8 @@ module Skypager
|
|
57
57
|
end
|
58
58
|
|
59
59
|
helpers do
|
60
|
-
def dropbox(path)
|
61
|
-
end
|
62
|
-
|
63
60
|
def site
|
64
|
-
@site ||= Skypager::Site.new(site_name)
|
65
|
-
end
|
66
|
-
|
67
|
-
def deployment
|
68
|
-
@deployment ||= Skypager::Sync::Amazon.client(deploy_options)
|
61
|
+
@site ||= Skypager::Site.new(site_name, deploy_options: deploy_options)
|
69
62
|
end
|
70
63
|
end
|
71
64
|
|
@@ -0,0 +1,211 @@
|
|
1
|
+
# Based on the s3_proxy gem
|
2
|
+
|
3
|
+
require 'aws-sdk-core'
|
4
|
+
require 'stringio'
|
5
|
+
require 'pry'
|
6
|
+
|
7
|
+
module Skypager
|
8
|
+
class Proxy
|
9
|
+
|
10
|
+
attr_reader :bucket,
|
11
|
+
:options,
|
12
|
+
:access_key_id,
|
13
|
+
:secret_access_key
|
14
|
+
|
15
|
+
def initialize(options={})
|
16
|
+
@options = options
|
17
|
+
@bucket = options[:bucket]
|
18
|
+
@access_key_id = options.fetch(:access_key_id) { Skypager.config.aws_access_key_id }
|
19
|
+
@secret_access_key = options.fetch(:secret_access_key) { Skypager.config.aws_secret_access_key }
|
20
|
+
end
|
21
|
+
|
22
|
+
def call(env)
|
23
|
+
if @options[:bucket]
|
24
|
+
s3_call(env)
|
25
|
+
elsif @options[:host] || @options[:port]
|
26
|
+
proxy_call(env)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def proxy_call(env)
|
31
|
+
request_proxy.call(env)
|
32
|
+
end
|
33
|
+
|
34
|
+
def s3
|
35
|
+
@s3 ||= Aws::S3.new(access_key_id: access_key_id, secret_access_key: secret_access_key, region: "us-east-1")
|
36
|
+
end
|
37
|
+
|
38
|
+
def request_proxy
|
39
|
+
o = @options
|
40
|
+
@request_proxy ||= RequestProxy.new.tap {|p| p.set_config(o) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def s3_call(env)
|
44
|
+
return Errors.method_not_allowed unless %w(GET HEAD).include?(env['REQUEST_METHOD'])
|
45
|
+
return Errors.not_found if env['PATH_INFO'].empty?
|
46
|
+
|
47
|
+
rack_request = Rack::Request.new(env)
|
48
|
+
key = "#{rack_request.path}".without_leading_slash
|
49
|
+
|
50
|
+
return Errors.not_found unless bucket && key
|
51
|
+
|
52
|
+
path = key.without_leading_slash
|
53
|
+
last = path.split("/").last
|
54
|
+
|
55
|
+
unless options[:directory_indexes] == false
|
56
|
+
# this just feels wrong, but i know it
|
57
|
+
# will work with middleman's directory indexes
|
58
|
+
if path.match(/\/$/)
|
59
|
+
path = "#{path}index.html"
|
60
|
+
elsif !last.match(/\.\w+$/)
|
61
|
+
path = "#{path}/index.html"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
req = {bucket: bucket, key: path}
|
66
|
+
|
67
|
+
req[:key] = "index.html" if req[:key].to_s.length == 0
|
68
|
+
|
69
|
+
req[:if_match] = env['HTTP_IF_MATCH'] if env['HTTP_IF_MATCH']
|
70
|
+
req[:if_none_match] = env['HTTP_IF_NONE_MATCH'] if env['HTTP_IF_NONE_MATCH']
|
71
|
+
req[:if_modified_since] = env['HTTP_IF_MODIFIED_SINCE'] if env['HTTP_IF_MODIFIED_SINCE']
|
72
|
+
req[:if_unmodified_since] = env['HTTP_IF_UNMODIFIED_SINCE'] if env['HTTP_UNMODIFIED_SINCE']
|
73
|
+
|
74
|
+
head = s3.head_object(req)
|
75
|
+
|
76
|
+
return Errors.not_found unless head
|
77
|
+
|
78
|
+
case env['REQUEST_METHOD']
|
79
|
+
when 'HEAD'
|
80
|
+
gentle env, req, head
|
81
|
+
when 'GET'
|
82
|
+
if env['rack.hijack?']
|
83
|
+
hijack env, req, head
|
84
|
+
else
|
85
|
+
gentle env, req, head
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
rescue Aws::S3::Errors::NoSuchKey, Aws::S3::Errors::NotFound
|
90
|
+
return Errors.not_found
|
91
|
+
|
92
|
+
rescue Aws::S3::Errors::NotModified
|
93
|
+
return Errors.not_modified
|
94
|
+
|
95
|
+
rescue Aws::S3::Errors::PreconditionFailed
|
96
|
+
return Errors.precondition_failed
|
97
|
+
|
98
|
+
rescue NameError => e
|
99
|
+
# https://github.com/aws/aws-sdk-core-ruby/pull/65
|
100
|
+
raise e unless e.message == "wrong constant name 412Error"
|
101
|
+
|
102
|
+
return Errors.precondition_failed
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def hijack(env, request, head)
|
108
|
+
env['rack.hijack'].call
|
109
|
+
|
110
|
+
io = env['rack.hijack_io']
|
111
|
+
begin
|
112
|
+
io.write "HTTP/1.1 200 OK\r\n"
|
113
|
+
io.write "Status: 200\r\n"
|
114
|
+
io.write "Connection: close\r\n"
|
115
|
+
io.write "Content-Type: #{head.content_type}\r\n"
|
116
|
+
io.write "Content-Length: #{head.content_length}\r\n"
|
117
|
+
io.write "ETag: #{head.etag}\r\n"
|
118
|
+
io.write "Last-Modified: #{head.last_modified}\r\n"
|
119
|
+
io.write "\r\n"
|
120
|
+
io.flush
|
121
|
+
|
122
|
+
s3.get_object(request, target: io)
|
123
|
+
ensure
|
124
|
+
io.close
|
125
|
+
end
|
126
|
+
return [200, {}, ['']]
|
127
|
+
end
|
128
|
+
|
129
|
+
def gentle(env, request, head)
|
130
|
+
case env['REQUEST_METHOD']
|
131
|
+
when 'GET'
|
132
|
+
fiber = Fiber.new do
|
133
|
+
s3.get_object(request) do |chunk|
|
134
|
+
Fiber.yield(chunk)
|
135
|
+
end
|
136
|
+
Fiber.yield(nil)
|
137
|
+
end
|
138
|
+
|
139
|
+
body = Enumerator.new do |y|
|
140
|
+
while n = fiber.resume
|
141
|
+
y << n
|
142
|
+
end
|
143
|
+
end
|
144
|
+
when 'HEAD'
|
145
|
+
body = ['']
|
146
|
+
end
|
147
|
+
|
148
|
+
headers = {
|
149
|
+
'Content-Type' => head.content_type.to_s,
|
150
|
+
'Content-Length' => head.content_length.to_s,
|
151
|
+
'Last-Modified' => head.last_modified.to_s,
|
152
|
+
'ETag' => head.etag.to_s,
|
153
|
+
}
|
154
|
+
|
155
|
+
[200, headers, body]
|
156
|
+
end
|
157
|
+
|
158
|
+
module Errors
|
159
|
+
class << self
|
160
|
+
def method_not_allowed
|
161
|
+
[405, {'Content-Type' => 'text/plain'}, ["method not allowed"]]
|
162
|
+
end
|
163
|
+
|
164
|
+
def not_found
|
165
|
+
[404, {'Content-Type' => 'text/plain'}, ["not found"]]
|
166
|
+
end
|
167
|
+
|
168
|
+
def forbidden
|
169
|
+
[403, {'Content-Type' => 'text/plain'}, ["forbidden"]]
|
170
|
+
end
|
171
|
+
|
172
|
+
def precondition_failed
|
173
|
+
[412, {'Content-Type' => 'text/plain'}, ["precondition failed"]]
|
174
|
+
end
|
175
|
+
|
176
|
+
def not_modified
|
177
|
+
[304, {}, [""]]
|
178
|
+
end
|
179
|
+
|
180
|
+
def unknown(code)
|
181
|
+
[code, {'Content-Type' => 'text/plain'}, ["Error: #{code}"]]
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
class RequestProxy < Rack::Proxy
|
187
|
+
def set_config options={}
|
188
|
+
cfg.merge!(options)
|
189
|
+
cfg
|
190
|
+
end
|
191
|
+
|
192
|
+
def cfg
|
193
|
+
@cfg ||= {}
|
194
|
+
end
|
195
|
+
|
196
|
+
def rewrite_env(e)
|
197
|
+
e.tap do |env|
|
198
|
+
current = env['HTTP_HOST']
|
199
|
+
|
200
|
+
current_host, current_port = current.split(':')
|
201
|
+
|
202
|
+
host = cfg[:host].to_s
|
203
|
+
host = host + ":#{ cfg[:port] }" if cfg[:port]
|
204
|
+
|
205
|
+
Rails.logger.info "replacing #{ current } with #{ host } #{ env['PATH_INFO'] }"
|
206
|
+
env['HTTP_HOST'] = host
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# The Skypager::Router provides a simple way for
|
2
|
+
# proxying requests to different skypager builds, or
|
3
|
+
# development environments.
|
4
|
+
module Skypager
|
5
|
+
class Router
|
6
|
+
attr_accessor :app
|
7
|
+
|
8
|
+
def initialize(app, options={})
|
9
|
+
@app = app
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_accessor :proxies
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
"Skypager Router. Serving #{ proxies.keys.join(", ") }"
|
19
|
+
end
|
20
|
+
|
21
|
+
def inspect
|
22
|
+
to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.add(subdomain, options={})
|
26
|
+
subdomain = subdomain.to_s
|
27
|
+
self.proxies ||= {}
|
28
|
+
self.proxies[subdomain] = Skypager.proxy(options)
|
29
|
+
end
|
30
|
+
|
31
|
+
def proxies
|
32
|
+
self.class.proxies
|
33
|
+
end
|
34
|
+
|
35
|
+
def call(env)
|
36
|
+
request = Rack::Request.new(env)
|
37
|
+
subdomain = request.host.split('.').first
|
38
|
+
|
39
|
+
handler = proxies.fetch(subdomain) do |key|
|
40
|
+
app
|
41
|
+
end
|
42
|
+
|
43
|
+
handler.call(env)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/skypager/site.rb
CHANGED
@@ -18,6 +18,10 @@ module Skypager
|
|
18
18
|
}
|
19
19
|
end
|
20
20
|
|
21
|
+
def deploy_options
|
22
|
+
options.fetch(:deploy_options, {})
|
23
|
+
end
|
24
|
+
|
21
25
|
def set attribute, value
|
22
26
|
@config[attribute.to_sym] = value
|
23
27
|
save!
|
@@ -53,17 +57,20 @@ module Skypager
|
|
53
57
|
def bucket(create=false)
|
54
58
|
return @bucket if @bucket
|
55
59
|
|
56
|
-
|
60
|
+
val = deploy_options.fetch(:bucket_name) { bucket_hostname }
|
61
|
+
|
62
|
+
b = Skypager.amazon.find_bucket_by_name(val) rescue nil
|
57
63
|
|
58
64
|
if create && !b
|
59
|
-
b = Skypager.amazon.create_bucket(
|
65
|
+
b = Skypager.amazon.create_bucket(val)
|
60
66
|
end
|
61
67
|
|
62
68
|
@bucket = b
|
63
69
|
end
|
64
70
|
|
65
|
-
def
|
66
|
-
|
71
|
+
def prepare_deploy(build_dir)
|
72
|
+
|
73
|
+
@deploy_targets = []
|
67
74
|
|
68
75
|
upload = lambda do |node|
|
69
76
|
next if node.to_s == ".DS_Store"
|
@@ -72,18 +79,65 @@ module Skypager
|
|
72
79
|
Array(node.children).each(&upload)
|
73
80
|
elsif node.file?
|
74
81
|
rel = node.relative_path_from(build_dir).to_s
|
75
|
-
|
76
|
-
|
82
|
+
previous = build_manifest[rel]
|
83
|
+
current = Digest::MD5.hexdigest(node.read)
|
84
|
+
|
85
|
+
if current != previous
|
86
|
+
@deploy_targets << {key: rel, node: node, digest: current}
|
87
|
+
end
|
77
88
|
end
|
78
89
|
end
|
79
90
|
|
80
91
|
build_dir.children.each(&upload)
|
92
|
+
|
93
|
+
@deploy_targets
|
94
|
+
end
|
95
|
+
|
96
|
+
def deploy(build_dir)
|
97
|
+
target = bucket || Skypager.amazon.s3_bucket
|
98
|
+
|
99
|
+
payload = prepare_deploy(build_dir)
|
100
|
+
|
101
|
+
if payload.empty?
|
102
|
+
puts "Nothing to deploy"
|
103
|
+
end
|
104
|
+
|
105
|
+
payload.each do |hash|
|
106
|
+
if target.files.create(key: hash[:key], body: File.open(hash[:node]), public: true)
|
107
|
+
puts "Deployed #{ hash[:key] }"
|
108
|
+
build_manifest[rel] = hash[:digest]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
set(:build_manifest, build_manifest)
|
113
|
+
payload.length
|
81
114
|
end
|
82
115
|
|
83
116
|
def use_cdn?
|
84
117
|
get(:use_cdn) == true || get(:use_cdn) == "yes" || get(:use_cdn) == "true"
|
85
118
|
end
|
86
119
|
|
120
|
+
def build_manifest
|
121
|
+
@build_manifest ||= get!(:build_manifest) || {}
|
122
|
+
end
|
123
|
+
|
124
|
+
def rebuild_manifest(build_dir)
|
125
|
+
walker = lambda do |node|
|
126
|
+
next if node.to_s == ".DS_Store"
|
127
|
+
|
128
|
+
if node.directory?
|
129
|
+
Array(node.children).each(&walker)
|
130
|
+
elsif node.file?
|
131
|
+
rel = node.relative_path_from(build_dir).to_s
|
132
|
+
digest = Digest::MD5.hexdigest(node.read)
|
133
|
+
build_manifest[rel] = digest
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
build_dir.children.each(&walker)
|
138
|
+
set(:build_manifest, build_manifest)
|
139
|
+
end
|
140
|
+
|
87
141
|
def paths_to_invalidate(app)
|
88
142
|
app.sitemap.resources.map {|r| "/#{r.request_path}" }
|
89
143
|
end
|
@@ -107,6 +161,18 @@ module Skypager
|
|
107
161
|
end
|
108
162
|
end
|
109
163
|
|
164
|
+
def dns_domain
|
165
|
+
Skypager.dns.domain
|
166
|
+
end
|
167
|
+
|
168
|
+
def dns_domain_records
|
169
|
+
Skypager.dns.domain_records
|
170
|
+
end
|
171
|
+
|
172
|
+
def has_cname_record?
|
173
|
+
get!(:has_cname)
|
174
|
+
end
|
175
|
+
|
110
176
|
def custom_domain?
|
111
177
|
get!(:custom_domain)
|
112
178
|
end
|
@@ -116,7 +182,7 @@ module Skypager
|
|
116
182
|
|
117
183
|
cfg = []
|
118
184
|
|
119
|
-
if custom_domain
|
185
|
+
if custom_domain
|
120
186
|
cfg.push(":custom_domain => '#{ custom_domain }'")
|
121
187
|
cfg.push(":use_cdn => true")
|
122
188
|
else
|
@@ -150,11 +216,10 @@ module Skypager
|
|
150
216
|
end
|
151
217
|
|
152
218
|
def bucket_host
|
153
|
-
|
219
|
+
URI.parse(bucket_url).host
|
154
220
|
end
|
155
221
|
|
156
222
|
def setup_cname
|
157
|
-
puts "Creating an alias for #{ cname_value } to #{ bucket_host }"
|
158
223
|
Skypager.dns.setup_cname(cname_value, bucket_host)
|
159
224
|
end
|
160
225
|
|
data/lib/skypager/sync/amazon.rb
CHANGED
@@ -129,7 +129,7 @@ module Skypager
|
|
129
129
|
def create_bucket(bucket_name)
|
130
130
|
storage.directories.create(key: bucket_name, public: true).tap do |bucket|
|
131
131
|
storage.put_bucket_website(bucket_name, 'index.html', key: 'error.html')
|
132
|
-
storage.put_bucket_cors(bucket_name, {"AllowedOrigin"=>"*","AllowedMethod"=>"GET","AllowedHeader"=>"Authorization"})
|
132
|
+
#storage.put_bucket_cors(bucket_name, {"AllowedOrigin"=>"*","AllowedMethod"=>"GET","AllowedHeader"=>"Authorization"})
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
data/lib/skypager/sync/folder.rb
CHANGED
data/lib/skypager/version.rb
CHANGED
data/skypager.gemspec
CHANGED
@@ -18,23 +18,25 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency 'hashie'
|
22
|
-
spec.add_dependency 'commander'
|
23
|
-
spec.add_dependency '
|
24
|
-
spec.add_dependency '
|
25
|
-
spec.add_dependency '
|
26
|
-
spec.add_dependency '
|
27
|
-
spec.add_dependency '
|
28
|
-
spec.add_dependency '
|
29
|
-
spec.add_dependency '
|
30
|
-
spec.add_dependency '
|
31
|
-
spec.add_dependency '
|
32
|
-
spec.add_dependency '
|
33
|
-
spec.add_dependency '
|
21
|
+
spec.add_dependency 'hashie', '~> 0'
|
22
|
+
spec.add_dependency 'commander', '~> 0'
|
23
|
+
spec.add_dependency 'fog', '~> 0'
|
24
|
+
spec.add_dependency 'dropbox-api', '~> 0.4'
|
25
|
+
spec.add_dependency 'google_drive', '~> 0'
|
26
|
+
spec.add_dependency 'middleman', '~> 0'
|
27
|
+
spec.add_dependency 'rack-contrib', '~> 0'
|
28
|
+
spec.add_dependency 'launchy', '~> 0'
|
29
|
+
spec.add_dependency 'activesupport', '~> 0'
|
30
|
+
spec.add_dependency 'axlsx', '~> 0'
|
31
|
+
spec.add_dependency 'uri_template', '~> 0'
|
32
|
+
spec.add_dependency 'dnsimple-ruby', '~> 0'
|
33
|
+
spec.add_dependency 'rack-proxy', '~> 0'
|
34
|
+
|
35
|
+
spec.add_dependency "aws-sdk-core", "2.0.0.rc8"
|
34
36
|
|
35
37
|
spec.add_development_dependency "bundler", "~> 1.3"
|
36
|
-
spec.add_development_dependency "rake"
|
37
|
-
spec.add_development_dependency "pry"
|
38
|
-
spec.add_development_dependency "pry-nav"
|
39
|
-
spec.add_development_dependency "rack-test"
|
38
|
+
spec.add_development_dependency "rake", '~> 0'
|
39
|
+
spec.add_development_dependency "pry", '~> 0'
|
40
|
+
spec.add_development_dependency "pry-nav", '~> 0'
|
41
|
+
spec.add_development_dependency "rack-test", '~> 0'
|
40
42
|
end
|
metadata
CHANGED
@@ -1,197 +1,211 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skypager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Soeder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
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: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: commander
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: aws-sdk
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
31
|
+
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
33
|
version: '0'
|
48
34
|
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- - "
|
38
|
+
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: '0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: fog
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- - "
|
45
|
+
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
47
|
version: '0'
|
62
48
|
type: :runtime
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- - "
|
52
|
+
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
54
|
version: '0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: dropbox-api
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- - "
|
59
|
+
- - "~>"
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.4
|
61
|
+
version: '0.4'
|
76
62
|
type: :runtime
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- - "
|
66
|
+
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.4
|
68
|
+
version: '0.4'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: google_drive
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
|
-
- - "
|
73
|
+
- - "~>"
|
88
74
|
- !ruby/object:Gem::Version
|
89
75
|
version: '0'
|
90
76
|
type: :runtime
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- - "
|
80
|
+
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '0'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: middleman
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
|
-
- - "
|
87
|
+
- - "~>"
|
102
88
|
- !ruby/object:Gem::Version
|
103
89
|
version: '0'
|
104
90
|
type: :runtime
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
|
-
- - "
|
94
|
+
- - "~>"
|
109
95
|
- !ruby/object:Gem::Version
|
110
96
|
version: '0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: rack-contrib
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
|
-
- - "
|
101
|
+
- - "~>"
|
116
102
|
- !ruby/object:Gem::Version
|
117
103
|
version: '0'
|
118
104
|
type: :runtime
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
|
-
- - "
|
108
|
+
- - "~>"
|
123
109
|
- !ruby/object:Gem::Version
|
124
110
|
version: '0'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
112
|
name: launchy
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
128
114
|
requirements:
|
129
|
-
- - "
|
115
|
+
- - "~>"
|
130
116
|
- !ruby/object:Gem::Version
|
131
117
|
version: '0'
|
132
118
|
type: :runtime
|
133
119
|
prerelease: false
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
135
121
|
requirements:
|
136
|
-
- - "
|
122
|
+
- - "~>"
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
version: '0'
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
126
|
name: activesupport
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
142
128
|
requirements:
|
143
|
-
- - "
|
129
|
+
- - "~>"
|
144
130
|
- !ruby/object:Gem::Version
|
145
131
|
version: '0'
|
146
132
|
type: :runtime
|
147
133
|
prerelease: false
|
148
134
|
version_requirements: !ruby/object:Gem::Requirement
|
149
135
|
requirements:
|
150
|
-
- - "
|
136
|
+
- - "~>"
|
151
137
|
- !ruby/object:Gem::Version
|
152
138
|
version: '0'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: axlsx
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
156
142
|
requirements:
|
157
|
-
- - "
|
143
|
+
- - "~>"
|
158
144
|
- !ruby/object:Gem::Version
|
159
145
|
version: '0'
|
160
146
|
type: :runtime
|
161
147
|
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
|
-
- - "
|
150
|
+
- - "~>"
|
165
151
|
- !ruby/object:Gem::Version
|
166
152
|
version: '0'
|
167
153
|
- !ruby/object:Gem::Dependency
|
168
154
|
name: uri_template
|
169
155
|
requirement: !ruby/object:Gem::Requirement
|
170
156
|
requirements:
|
171
|
-
- - "
|
157
|
+
- - "~>"
|
172
158
|
- !ruby/object:Gem::Version
|
173
159
|
version: '0'
|
174
160
|
type: :runtime
|
175
161
|
prerelease: false
|
176
162
|
version_requirements: !ruby/object:Gem::Requirement
|
177
163
|
requirements:
|
178
|
-
- - "
|
164
|
+
- - "~>"
|
179
165
|
- !ruby/object:Gem::Version
|
180
166
|
version: '0'
|
181
167
|
- !ruby/object:Gem::Dependency
|
182
168
|
name: dnsimple-ruby
|
183
169
|
requirement: !ruby/object:Gem::Requirement
|
184
170
|
requirements:
|
185
|
-
- - "
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: rack-proxy
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
186
|
- !ruby/object:Gem::Version
|
187
187
|
version: '0'
|
188
188
|
type: :runtime
|
189
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
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: aws-sdk-core
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - '='
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 2.0.0.rc8
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - '='
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 2.0.0.rc8
|
195
209
|
- !ruby/object:Gem::Dependency
|
196
210
|
name: bundler
|
197
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,56 +224,56 @@ dependencies:
|
|
210
224
|
name: rake
|
211
225
|
requirement: !ruby/object:Gem::Requirement
|
212
226
|
requirements:
|
213
|
-
- - "
|
227
|
+
- - "~>"
|
214
228
|
- !ruby/object:Gem::Version
|
215
229
|
version: '0'
|
216
230
|
type: :development
|
217
231
|
prerelease: false
|
218
232
|
version_requirements: !ruby/object:Gem::Requirement
|
219
233
|
requirements:
|
220
|
-
- - "
|
234
|
+
- - "~>"
|
221
235
|
- !ruby/object:Gem::Version
|
222
236
|
version: '0'
|
223
237
|
- !ruby/object:Gem::Dependency
|
224
238
|
name: pry
|
225
239
|
requirement: !ruby/object:Gem::Requirement
|
226
240
|
requirements:
|
227
|
-
- - "
|
241
|
+
- - "~>"
|
228
242
|
- !ruby/object:Gem::Version
|
229
243
|
version: '0'
|
230
244
|
type: :development
|
231
245
|
prerelease: false
|
232
246
|
version_requirements: !ruby/object:Gem::Requirement
|
233
247
|
requirements:
|
234
|
-
- - "
|
248
|
+
- - "~>"
|
235
249
|
- !ruby/object:Gem::Version
|
236
250
|
version: '0'
|
237
251
|
- !ruby/object:Gem::Dependency
|
238
252
|
name: pry-nav
|
239
253
|
requirement: !ruby/object:Gem::Requirement
|
240
254
|
requirements:
|
241
|
-
- - "
|
255
|
+
- - "~>"
|
242
256
|
- !ruby/object:Gem::Version
|
243
257
|
version: '0'
|
244
258
|
type: :development
|
245
259
|
prerelease: false
|
246
260
|
version_requirements: !ruby/object:Gem::Requirement
|
247
261
|
requirements:
|
248
|
-
- - "
|
262
|
+
- - "~>"
|
249
263
|
- !ruby/object:Gem::Version
|
250
264
|
version: '0'
|
251
265
|
- !ruby/object:Gem::Dependency
|
252
266
|
name: rack-test
|
253
267
|
requirement: !ruby/object:Gem::Requirement
|
254
268
|
requirements:
|
255
|
-
- - "
|
269
|
+
- - "~>"
|
256
270
|
- !ruby/object:Gem::Version
|
257
271
|
version: '0'
|
258
272
|
type: :development
|
259
273
|
prerelease: false
|
260
274
|
version_requirements: !ruby/object:Gem::Requirement
|
261
275
|
requirements:
|
262
|
-
- - "
|
276
|
+
- - "~>"
|
263
277
|
- !ruby/object:Gem::Version
|
264
278
|
version: '0'
|
265
279
|
description: Skypager is for launching your websites
|
@@ -272,8 +286,11 @@ extra_rdoc_files: []
|
|
272
286
|
files:
|
273
287
|
- ".gitignore"
|
274
288
|
- Gemfile
|
289
|
+
- LICENSE.md
|
275
290
|
- LICENSE.txt
|
291
|
+
- README.md
|
276
292
|
- Rakefile
|
293
|
+
- VISION.md
|
277
294
|
- bin/skypager
|
278
295
|
- examples/.gitignore
|
279
296
|
- examples/blog-site/.gitignore
|
@@ -335,6 +352,8 @@ files:
|
|
335
352
|
- lib/skypager/middleman/commands/data.rb
|
336
353
|
- lib/skypager/middleman/commands/deploy.rb
|
337
354
|
- lib/skypager/middleman/commands/sync.rb
|
355
|
+
- lib/skypager/proxy.rb
|
356
|
+
- lib/skypager/router.rb
|
338
357
|
- lib/skypager/site.rb
|
339
358
|
- lib/skypager/sync.rb
|
340
359
|
- lib/skypager/sync/amazon.rb
|