skypager 0.0.3 → 0.0.4

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: 7d1a82368d73634a06f3c21b9c03d4e2fba74204
4
- data.tar.gz: 45113d0e787bc3e7f04de8e6b7ea25f728bb069a
3
+ metadata.gz: dd2176972c399bbfec3b8fde460f7592ecfca5a7
4
+ data.tar.gz: 08290cdac67c958f31a5e9ca96c2ede7a8827fd8
5
5
  SHA512:
6
- metadata.gz: e17ddc2b802cedfaeb86f7398076aa556e1a44ead479015e63f2ab1efc52cf08ee970ac1dfe88435fdb06720871cfe7fe9e0cc778e54722678326c8902e250e0
7
- data.tar.gz: 52c5c06de0a0a9bb8ca0f1dfd00d08acf048410278712626601e6293a884e3b9fd7f3f731ea7760c3d59605706d23ef1d66aee8d4ad92ed3828f67c84212907c
6
+ metadata.gz: 661f07c8c3beaaf3e466ba68e7fa432c6ec1d62852f02e4bf09762dd97b9db9edd1fd4c3101266462b07bae83097ddf90f7420f7b6fb7f64ccba350c7189e2df
7
+ data.tar.gz: 09c044b5e5cdc7554047ad4e1c0827619455edd9b7d9bfd58b8d513f174835ed6c97d67a19845a020d76607367b179197448f23076fc31396cc20c80ec739160
data/LICENSE.md ADDED
@@ -0,0 +1,3 @@
1
+ Copyright Architects.io, Inc. 2014
2
+
3
+ License TBD
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
@@ -33,6 +33,10 @@ module Skypager::DNS
33
33
  end
34
34
  end
35
35
 
36
+ def domain
37
+ parent_domain
38
+ end
39
+
36
40
  def parent_domain
37
41
  @parent_domain ||= DNSimple::Domain.find(Skypager.config.domain)
38
42
  end
@@ -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
- b = Skypager.amazon.find_bucket_by_name(bucket_hostname) rescue nil
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(bucket_hostname)
65
+ b = Skypager.amazon.create_bucket(val)
60
66
  end
61
67
 
62
68
  @bucket = b
63
69
  end
64
70
 
65
- def deploy(build_dir)
66
- target = bucket || Skypager.amazon.s3_bucket
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
- puts "Deploying #{ rel }"
76
- target.files.create(key: rel, body: File.open(node), public: true)
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.length > 0
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
- @bucket_host ||= fetch(:bucket_host) { URI.parse("http://#{ bucket_url }").host }
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
 
@@ -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
 
@@ -62,7 +62,7 @@ module Skypager
62
62
 
63
63
  if entry.is_deleted
64
64
  puts "Removing #{ local }"
65
- local.rmtree
65
+ local.rmtree if local.exist?
66
66
  elsif entry.is_dir == true
67
67
  unless local.exist?
68
68
  puts "Creating #{ local } directory"
@@ -1,3 +1,3 @@
1
1
  module Skypager
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
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 'aws-sdk'
24
- spec.add_dependency 'fog'
25
- spec.add_dependency 'dropbox-api', '>= 0.4.6'
26
- spec.add_dependency 'google_drive'
27
- spec.add_dependency 'middleman'
28
- spec.add_dependency 'rack-contrib'
29
- spec.add_dependency 'launchy'
30
- spec.add_dependency 'activesupport'
31
- spec.add_dependency 'axlsx'
32
- spec.add_dependency 'uri_template'
33
- spec.add_dependency 'dnsimple-ruby'
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.3
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-14 00:00:00.000000000 Z
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.6
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.6
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