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 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