skypager 0.1.2 → 0.2.0

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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -11
  3. data/bin/skypager +16 -10
  4. data/lib/skypager.rb +1 -69
  5. data/lib/skypager/cli.rb +14 -0
  6. data/lib/skypager/cli/01_extensions.rb +25 -0
  7. data/lib/skypager/cli/config.rb +41 -0
  8. data/lib/skypager/proxy.rb +0 -10
  9. data/lib/skypager/version.rb +1 -1
  10. data/skypager.gemspec +1 -15
  11. metadata +9 -216
  12. data/ARCHITECTURE.md +0 -34
  13. data/CONTRIBUTING.md +0 -7
  14. data/LICENSE.txt +0 -22
  15. data/bin/bootstrap.sh +0 -29
  16. data/examples/.gitignore +0 -4
  17. data/examples/blog-site/.gitignore +0 -18
  18. data/examples/blog-site/.pryrc +0 -4
  19. data/examples/blog-site/Gemfile +0 -8
  20. data/examples/blog-site/config.rb +0 -17
  21. data/examples/blog-site/data/dropbox.json +0 -1
  22. data/examples/blog-site/source/images/background.png +0 -0
  23. data/examples/blog-site/source/images/middleman.png +0 -0
  24. data/examples/blog-site/source/index.html.erb +0 -10
  25. data/examples/blog-site/source/javascripts/all.js +0 -1
  26. data/examples/blog-site/source/layouts/layout.erb +0 -19
  27. data/examples/blog-site/source/posts/introduction-to-skypager.html.md +0 -23
  28. data/examples/blog-site/source/posts/skypager-and-dnsimple-and-amazon-web-services-combo.html.md +0 -9
  29. data/examples/blog-site/source/stylesheets/all.css +0 -55
  30. data/examples/blog-site/source/stylesheets/normalize.css +0 -375
  31. data/examples/gallery-site/.gitignore +0 -18
  32. data/examples/gallery-site/.pryrc +0 -4
  33. data/examples/gallery-site/Gemfile +0 -11
  34. data/examples/gallery-site/config.rb +0 -38
  35. data/examples/gallery-site/data/dropbox.json +0 -1
  36. data/examples/gallery-site/data/galleries.json +0 -1
  37. data/examples/gallery-site/source/gallery.html.erb +0 -7
  38. data/examples/gallery-site/source/images/background.png +0 -0
  39. data/examples/gallery-site/source/images/galleries/cristian-gallery-1/001.jpg +0 -0
  40. data/examples/gallery-site/source/images/galleries/cristian-gallery-1/002.jpg +0 -0
  41. data/examples/gallery-site/source/images/galleries/cristian-gallery-1/003.jpg +0 -0
  42. data/examples/gallery-site/source/images/galleries/cristian-gallery-1/004.jpg +0 -0
  43. data/examples/gallery-site/source/images/galleries/luca-gallery-1/001.jpg +0 -0
  44. data/examples/gallery-site/source/images/galleries/luca-gallery-1/002.JPG +0 -0
  45. data/examples/gallery-site/source/images/galleries/luca-gallery-1/003.jpg +0 -0
  46. data/examples/gallery-site/source/images/galleries/luca-gallery-1/004.JPG +0 -0
  47. data/examples/gallery-site/source/images/middleman.png +0 -0
  48. data/examples/gallery-site/source/index.html.erb +0 -10
  49. data/examples/gallery-site/source/javascripts/all.js +0 -1
  50. data/examples/gallery-site/source/layouts/layout.erb +0 -20
  51. data/examples/gallery-site/source/stylesheets/all.css +0 -0
  52. data/examples/gallery-site/source/stylesheets/normalize.css +0 -375
  53. data/examples/gallery-site/source/tutorial.md +0 -151
  54. data/lib/skypager/builder.rb +0 -158
  55. data/lib/skypager/cli/commands/build.rb +0 -64
  56. data/lib/skypager/cli/commands/config.rb +0 -58
  57. data/lib/skypager/cli/commands/create.rb +0 -98
  58. data/lib/skypager/cli/commands/deploy.rb +0 -62
  59. data/lib/skypager/cli/commands/edit.rb +0 -32
  60. data/lib/skypager/cli/commands/list.rb +0 -12
  61. data/lib/skypager/cli/commands/setup.rb +0 -153
  62. data/lib/skypager/cli/commands/site.rb +0 -22
  63. data/lib/skypager/cli/commands/sync.rb +0 -20
  64. data/lib/skypager/data.rb +0 -8
  65. data/lib/skypager/data/excel_spreadsheet.rb +0 -8
  66. data/lib/skypager/data/google_spreadsheet.rb +0 -227
  67. data/lib/skypager/data/request.rb +0 -12
  68. data/lib/skypager/data/source.rb +0 -194
  69. data/lib/skypager/data/source_routes_proxy.rb +0 -30
  70. data/lib/skypager/dns.rb +0 -69
  71. data/lib/skypager/extension.rb +0 -271
  72. data/lib/skypager/middleman/commands/data.rb +0 -0
  73. data/lib/skypager/middleman/commands/deploy.rb +0 -0
  74. data/lib/skypager/middleman/commands/sync.rb +0 -0
  75. data/lib/skypager/sync.rb +0 -23
  76. data/lib/skypager/sync/amazon.rb +0 -181
  77. data/lib/skypager/sync/dropbox.rb +0 -173
  78. data/lib/skypager/sync/dropbox/delta.rb +0 -67
  79. data/lib/skypager/sync/folder.rb +0 -266
  80. data/lib/skypager/sync/github.rb +0 -55
  81. data/lib/skypager/sync/google.rb +0 -143
  82. data/spec/dummy/site-one/.gitignore +0 -18
  83. data/spec/dummy/site-one/Gemfile +0 -14
  84. data/spec/dummy/site-one/config.rb +0 -13
  85. data/spec/dummy/site-one/source/images/background.png +0 -0
  86. data/spec/dummy/site-one/source/images/middleman.png +0 -0
  87. data/spec/dummy/site-one/source/index.html.erb +0 -10
  88. data/spec/dummy/site-one/source/javascripts/all.js +0 -1
  89. data/spec/dummy/site-one/source/layouts/layout.erb +0 -19
  90. data/spec/dummy/site-one/source/stylesheets/all.css +0 -55
  91. data/spec/dummy/site-one/source/stylesheets/normalize.css +0 -375
  92. data/spec/lib/skypager/builder/server_spec.rb +0 -5
  93. data/spec/lib/skypager/configuration_spec.rb +0 -12
  94. data/spec/lib/skypager/data_spec.rb +0 -5
  95. data/spec/lib/skypager/site_spec.rb +0 -44
  96. data/spec/lib/skypager_spec.rb +0 -9
  97. data/spec/skypager-test-config.rb.example +0 -22
  98. data/spec/spec_helper.rb +0 -49
  99. data/spec/support/fixtures/cwd_config.json +0 -3
  100. data/spec/support/fixtures/home_config.json +0 -1
  101. data/spec/support/json_helper.rb +0 -7
File without changes
File without changes
File without changes
@@ -1,23 +0,0 @@
1
- module Skypager
2
- module Sync
3
- def self.sync_dropbox_path(path, options={})
4
- dropbox.sync_path(path, options)
5
- end
6
-
7
- def self.amazon(options={})
8
- require 'skypager/sync/amazon'
9
- Skypager::Sync::Amazon.client
10
- end
11
-
12
- def self.google(options={})
13
- require 'skypager/sync/google'
14
- Skypager::Sync::Google.client
15
- end
16
-
17
- def self.dropbox(options={})
18
- require 'skypager/sync/dropbox'
19
- Skypager::Sync::Dropbox.client(options)
20
- end
21
- end
22
- end
23
-
@@ -1,181 +0,0 @@
1
- module Skypager
2
- module Sync
3
- class Amazon
4
- include Singleton
5
-
6
- require 'fog'
7
-
8
- def aws_access_key_id
9
- options[:aws_access_key_id] || options[:access_key_id] || Skypager.config.aws_access_key_id
10
- end
11
-
12
- def aws_secret_access_key
13
- options[:aws_secret_access_key] || options[:secret_access_key] || Skypager.config.aws_secret_access_key
14
- end
15
-
16
- def storage
17
- return @storage if @storage
18
-
19
- # Silence fog warnings
20
- Fog::Logger.define_singleton_method(:warning) do |*args|
21
- nil
22
- end
23
-
24
- @storage = Fog::Storage.new({
25
- provider: 'AWS',
26
- aws_access_key_id: aws_access_key_id,
27
- aws_secret_access_key: aws_secret_access_key,
28
- path_style: true
29
- })
30
-
31
-
32
- @storage
33
- end
34
-
35
- def cdn
36
- @cdn ||= Fog::CDN.new({
37
- provider: 'AWS',
38
- aws_access_key_id: aws_access_key_id,
39
- aws_secret_access_key: aws_secret_access_key
40
- })
41
- end
42
-
43
- def s3_bucket_website_url
44
- if s3_bucket.is_a?(Fog::Storage::AWS::Directory)
45
- website_url_for(s3_bucket)
46
- end
47
- end
48
-
49
- def site_description
50
- options[:description] || options[:site_name] || s3_bucket.key
51
- end
52
-
53
- # the domain, and the domain with www
54
- def site_domain_aliases
55
- options[:aliases]
56
- end
57
-
58
- def s3_bucket
59
- if bucket_name = options[:bucket_name] || Skypager.config.get("bucket_name") || Skypager.app.deploy_options[:bucket_name]
60
- if bucket = find_bucket_by_name(bucket_name)
61
- return bucket
62
- else
63
- "There is no bucket named: #{ bucket_name }. You can create one by running 'skypager setup amazon --create-bucket=BUCKET_NAME"
64
- end
65
- else
66
- puts "Can't determine what bucket name to use."
67
- end
68
- end
69
-
70
- def create_cdn_for(site)
71
- o = cdn_options(website_url: site.bucket_host,
72
- comment: site.description,
73
- aliases: site.aliases.join(","))
74
-
75
- existing = cdn.distributions.find do |distribution|
76
- distribution.comment == site.description
77
- end
78
-
79
- return existing if existing
80
-
81
- cdn.distributions.create(o).tap do |distribution|
82
- site.set distribution.domain
83
- end
84
- end
85
-
86
- def cdn_options(o={})
87
- {
88
- enabled: true,
89
- custom_origin: {
90
- 'DNSName'=> o.fetch(:website_url) { s3_bucket_website_url },
91
- 'OriginProtocolPolicy'=>'match-viewer'
92
- },
93
- comment: o.fetch(:description) { site_description },
94
- caller_reference: Time.now.to_i.to_s,
95
- cname: o.fetch(:domain_aliases) { site_domain_aliases },
96
- default_root_object: 'index.html'
97
- }
98
- end
99
-
100
- def self.client(options={})
101
- @client ||= begin
102
- instance.with_options(options)
103
- end
104
- end
105
-
106
-
107
- def self.method_missing(meth, *args, &block)
108
- if client.respond_to?(meth)
109
- return client.send(meth, *args, &block)
110
- end
111
-
112
- super
113
- end
114
-
115
- def website_host_for(bucket_or_bucket_name)
116
- URI.parse(webite_url_for(bucket_or_bucket_name)).host
117
- end
118
-
119
- def website_url_for(bucket_or_bucket_name)
120
- bucket = bucket_or_bucket_name
121
-
122
- if bucket_or_bucket_name.is_a?(String)
123
- bucket = storage.directories.get(bucket_or_bucket_name)
124
- end
125
-
126
- if bucket
127
- "http://#{bucket.key}.s3-website-#{ bucket.location }.amazonaws.com"
128
- end
129
- end
130
-
131
- def find_or_create_bucket(bucket_name)
132
- find_bucket_by_name(bucket_name) || create_bucket(bucket_name)
133
- end
134
-
135
- def find_bucket_by_name(bucket_name)
136
- storage.directories.get(bucket_name) rescue nil
137
- end
138
-
139
- def create_bucket(bucket_name)
140
- storage.directories.create(key: bucket_name, public: true).tap do |bucket|
141
- storage.put_bucket_website(bucket_name, 'index.html', key: 'error.html')
142
- #storage.put_bucket_cors(bucket_name, {"AllowedOrigin"=>"*","AllowedMethod"=>"GET","AllowedHeader"=>"Authorization"})
143
- end
144
- end
145
-
146
- def create_redirect_bucket(bucket_name, redirect_to_bucket_name)
147
- create_bucket(redirect_to_bucket_name) unless find_bucket_by_name(redirect_to_bucket_name)
148
- create_bucket(bucket_name)
149
- end
150
-
151
- def with_options(opts={})
152
- options.merge!(opts)
153
- self
154
- end
155
-
156
- def options
157
- @options ||= {}
158
- end
159
-
160
- def has_application_keys?
161
- (Skypager.config.aws_access_key_id.to_s.length > 0 && Skypager.config.aws_secret_access_key.to_s.length > 0)
162
- end
163
-
164
- def setup(options={})
165
- return if has_application_keys?
166
-
167
- unless Skypager.config.aws_access_key_id.to_s.length > 0
168
- if value = options[:access_key_id] || ask("What is the AWS Access Key ID?", String)
169
- Skypager.config.set 'aws_access_key_id', value
170
- end
171
- end
172
-
173
- unless Skypager.config.aws_secret_access_key.to_s.length > 0
174
- if value = options[:secret_access_key] || ask("What is the AWS Secret Access Key?", String)
175
- Skypager.config.set 'aws_secret_access_key', value
176
- end
177
- end
178
- end
179
- end
180
- end
181
- end
@@ -1,173 +0,0 @@
1
- module Skypager
2
- module Sync
3
- class Dropbox
4
- include Singleton
5
-
6
- def self.method_missing(meth, *args, &block)
7
- if client.respond_to?(meth)
8
- return client.send(meth, *args, &block)
9
- end
10
-
11
- super
12
- end
13
-
14
- def self.client(options={})
15
- @client ||= begin
16
- ::Dropbox::API::Config.app_key = options.fetch(:dropbox_app_key) { Skypager.config.dropbox_app_key }
17
- ::Dropbox::API::Config.app_secret = options.fetch(:dropbox_app_secret) { Skypager.config.dropbox_app_secret }
18
- ::Dropbox::API::Config.mode = options.fetch(:dropbox_app_type) { Skypager.config.dropbox_app_type }
19
- instance.with_options(options)
20
- end
21
- end
22
-
23
- def sandboxed_app?
24
- entry = api.ls.first
25
- entry && entry.root == "app_folder"
26
- end
27
-
28
- def api
29
- @api ||= begin
30
- token = options.fetch(:token) { Skypager.config.dropbox_client_token }
31
- secret = options.fetch(:secret) { Skypager.config.dropbox_client_secret }
32
- ::Dropbox::API::Client.new(token: token , secret: secret)
33
- end
34
- end
35
-
36
- def find(path)
37
- api.find(path)
38
- rescue ::Dropbox::API::Error::NotFound
39
- nil
40
- end
41
-
42
- def push_from(local_path, options={})
43
- path_prefix = options.fetch(:prefix)
44
- root = options[:root]
45
-
46
- unless find(path_prefix)
47
- api.mkdir(path_prefix)
48
- end
49
-
50
- uploader = lambda do |node|
51
- next if node.to_s == ".DS_Store"
52
-
53
- if node.directory?
54
- Array(node.children).each(&uploader)
55
- elsif node.file?
56
- relative = node.relative_path_from(local_path)
57
- target = "#{path_prefix}/#{relative}"
58
- target = target.gsub(/^\//,'')
59
- api.upload(target, node.read)
60
- end
61
- end
62
-
63
- Pathname(local_path).children.each(&uploader)
64
- end
65
-
66
- def create_site_folder(folder, allow_overwrite=false)
67
- found = find(folder)
68
-
69
- unless (!found || (found && !allow_overwrite))
70
- api.mkdir("/#{folder}")
71
- end
72
- end
73
-
74
- def sync(local_path, remote_path, options={})
75
- sync_folders(local_path, remote_path, options)
76
- end
77
-
78
- # Instructs Skypager to create a syncable folder
79
- # between the local and remote path, and optionally
80
- # modifies the middleman config for the site
81
- def sync_folders(local_path, remote_path, options={})
82
- app = options[:app]
83
-
84
- folder = Skypager::Sync::Folder.new(local_path: local_path,
85
- remote_path: remote_path,
86
- app: app).synced
87
-
88
- if !!options[:append_config] == true
89
- Skypager.append_config(folder.config_line)
90
- end
91
-
92
- folder
93
- end
94
-
95
- def method_missing meth, *args, &block
96
- if api.respond_to?(meth)
97
- return api.send(meth, *args, &block)
98
- end
99
-
100
- super
101
- end
102
-
103
- def authorize(token, secret)
104
- @api = nil if @api
105
- options[:token] = token
106
- options[:secret] = secret
107
- self
108
- end
109
-
110
- def options
111
- @options ||= {}
112
- end
113
-
114
- def with_options(opts={})
115
- options.merge!(opts)
116
- self
117
- end
118
-
119
- def requires_setup?
120
- !(dropbox_app_key.length > 0 && dropbox_app_secret.length > 0)
121
- end
122
-
123
- def dropbox_app_key
124
- Skypager.config.dropbox_app_key.to_s
125
- end
126
-
127
- def dropbox_app_secret
128
- Skypager.config.dropbox_app_secret.to_s
129
- end
130
-
131
- def setup(options={})
132
- if requires_setup?
133
- if dropbox_app_key.length == 0
134
- if answer = options[:dropbox_app_key] || ask("What is the dropbox app key?", String)
135
- Skypager.config.set("dropbox_app_key", answer)
136
- end
137
- if answer = options[:dropbox_app_secret] || ask("What is the dropbox app secret?", String)
138
- Skypager.config.set("dropbox_app_secret", answer)
139
- end
140
- end
141
- end
142
-
143
- raise 'Missing dropbox application values' if requires_setup?
144
-
145
- ::Dropbox::API::Config.app_key = Skypager.config.dropbox_app_key
146
- ::Dropbox::API::Config.app_secret = Skypager.config.dropbox_app_secret
147
-
148
- consumer = ::Dropbox::API::OAuth.consumer(:authorize)
149
- request_token = consumer.get_request_token
150
- puts "\nGo to this url and click 'Authorize' to get the token:"
151
- puts request_token.authorize_url
152
- Launchy.open(request_token.authorize_url)
153
-
154
- query = request_token.authorize_url.split('?').last
155
- params = CGI.parse(query)
156
- token = params['oauth_token'].first
157
- print "\nOnce you authorize the app on Dropbox, press enter... "
158
- STDIN.gets.chomp
159
-
160
- access_token = request_token.get_access_token(:oauth_verifier => token)
161
-
162
- Skypager.config.set 'dropbox_client_token', access_token.token
163
- Skypager.config.set 'dropbox_client_secret', access_token.secret
164
-
165
- puts "\nAuthorization complete!:\n\n"
166
- puts " Dropbox::API::Config.app_key = '#{consumer.key}'"
167
- puts " Dropbox::API::Config.app_secret = '#{consumer.secret}'"
168
- puts " client = Dropbox::API::Client.new(:token => '#{access_token.token}', :secret => '#{access_token.secret}')"
169
- puts "\n"
170
- end
171
- end
172
- end
173
- end
@@ -1,67 +0,0 @@
1
- module Skypager
2
- module Sync
3
- class DropboxDelta
4
-
5
- attr_accessor :client,
6
- :data,
7
- :cursor,
8
- :entries,
9
- :path_prefix
10
-
11
- def initialize(client, cursor, path_prefix=nil)
12
- @client = client
13
- @cursor = cursor
14
- @path_prefix = path_prefix
15
- end
16
-
17
- def processed!
18
- # TODO
19
- # Should update cursor
20
- end
21
-
22
- def entries
23
- return @entries if @entries
24
- fetch
25
- @entries
26
- end
27
-
28
- def _dropbox_delta at=nil
29
- at ||= cursor
30
- response = client.delta(at, path_prefix)
31
- self.cursor = response["cursor"]
32
- response
33
- end
34
-
35
- def data
36
- @data ||= fetch
37
- end
38
-
39
- def on_reset path_prefix, cursor
40
- end
41
-
42
- def fetch
43
- return @response if @response
44
-
45
- response = _dropbox_delta
46
-
47
- if response["reset"] == true
48
- on_reset(path_prefix, cursor)
49
- end
50
-
51
- self.entries = {}.to_mash
52
-
53
- response["entries"].each do |entry|
54
- path, meta = entry
55
- self.entries[path] = meta
56
- end
57
-
58
- if response["has_more"] == true
59
- # TODO Implement
60
- end
61
-
62
- @response = response
63
- end
64
-
65
- end
66
- end
67
- end