ale 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +8 -0
- data/bin/ale +1 -2
- data/lib/ale.rb +14 -11
- data/lib/ale/cli.rb +33 -31
- data/lib/ale/config.rb +74 -1
- data/lib/ale/site.rb +14 -13
- data/lib/ale/uploader.rb +89 -0
- data/lib/ale/version.rb +1 -1
- metadata +7 -6
- data/lib/ale/dsl.rb +0 -33
data/README.md
ADDED
data/bin/ale
CHANGED
data/lib/ale.rb
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
module Ale
|
2
|
-
autoload :CLI,
|
3
|
-
autoload :Config,
|
4
|
-
autoload :
|
5
|
-
autoload :
|
2
|
+
autoload :CLI, 'ale/cli'
|
3
|
+
autoload :Config, 'ale/config'
|
4
|
+
autoload :Site, 'ale/site'
|
5
|
+
autoload :Uploader, 'ale/uploader'
|
6
6
|
|
7
7
|
class << self
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
})
|
8
|
+
attr_writer :alefile, :root
|
9
|
+
|
10
|
+
def alefile
|
11
|
+
@alefile || File.join(root, 'Alefile')
|
13
12
|
end
|
14
13
|
|
15
|
-
def
|
16
|
-
File.expand_path('./')
|
14
|
+
def root
|
15
|
+
@root || File.expand_path('./')
|
17
16
|
end
|
18
17
|
end
|
18
|
+
|
19
|
+
class AlefileNotFound < StandardError; end
|
20
|
+
class BucketNotFound < StandardError; end
|
21
|
+
class BucketNotSpecified < StandardError; end
|
19
22
|
end
|
data/lib/ale/cli.rb
CHANGED
@@ -7,43 +7,45 @@ module Ale
|
|
7
7
|
|
8
8
|
default_task :upload
|
9
9
|
|
10
|
-
desc 'build', '
|
10
|
+
desc 'build', 'Prepares the site for upload, if you using a static site generator'
|
11
|
+
method_option 'generator', :type => :string, :banner =>
|
12
|
+
'Specify which static site generator to use. Use this if it is not automatically detecting.'
|
11
13
|
def build
|
12
|
-
|
14
|
+
opts = options.dup
|
15
|
+
|
16
|
+
say("Building site in #{Ale.root}")
|
17
|
+
rescue AlefileNotFound
|
18
|
+
say('Count not locale Alefile', :red)
|
13
19
|
end
|
14
20
|
|
15
|
-
desc 'upload', 'Uploads the site to S3'
|
21
|
+
desc 'upload', 'Uploads the built site to S3'
|
22
|
+
method_option 'alefile', :type => :string, :banner =>
|
23
|
+
'Use the specified alefile instead of Alefile'
|
16
24
|
def upload
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
say('Your upload is complete!', :green)
|
33
|
-
|
34
|
-
if bucket.exists?
|
35
|
-
else
|
36
|
-
say("Bucket named #{bucket.name} does not exist", :red)
|
37
|
-
end
|
38
|
-
else
|
39
|
-
say('Could not locate Upfile', :red)
|
40
|
-
end
|
25
|
+
opts = options.dup
|
26
|
+
|
27
|
+
Ale.alefile = opts[:alefile]
|
28
|
+
Ale::Config.load(Ale.alefile)
|
29
|
+
|
30
|
+
uploader.upload!
|
31
|
+
|
32
|
+
say("Uploading site in #{uploader.site.directory}")
|
33
|
+
rescue AlefileNotFound
|
34
|
+
say('Count not locale Alefile', :red)
|
35
|
+
rescue BucketNotFound
|
36
|
+
say('Bucket not found on S3', :red)
|
37
|
+
rescue BucketNotSpecified
|
38
|
+
say('No bucket specificed in Alefile', :red)
|
41
39
|
end
|
42
|
-
|
43
|
-
private
|
44
40
|
|
45
|
-
|
46
|
-
|
41
|
+
private
|
42
|
+
|
43
|
+
def site
|
44
|
+
@site ||= Site.detect(Ale.root)
|
45
|
+
end
|
46
|
+
|
47
|
+
def uploader
|
48
|
+
@uploader ||= Uploader.new(site)
|
47
49
|
end
|
48
50
|
end
|
49
51
|
end
|
data/lib/ale/config.rb
CHANGED
@@ -1,8 +1,24 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
1
3
|
module Ale
|
2
4
|
module Config
|
3
5
|
class << self
|
4
6
|
attr_accessor :bucket
|
5
|
-
attr_writer :amazon_access_key_id, :amazon_secret_access_key
|
7
|
+
attr_writer :amazon_access_key_id, :amazon_secret_access_key,
|
8
|
+
:ignored_files, :public_files, :private_files,
|
9
|
+
:upload_strategy
|
10
|
+
|
11
|
+
def load(alefile)
|
12
|
+
if File.exists?(alefile)
|
13
|
+
DSL.new.tap do |dsl|
|
14
|
+
contents = File.open(alefile, 'rb') { |f| f.read }
|
15
|
+
dsl.instance_eval(contents, alefile.to_s, 1)
|
16
|
+
end
|
17
|
+
configure_amazon!
|
18
|
+
else
|
19
|
+
raise AlefileNotFound
|
20
|
+
end
|
21
|
+
end
|
6
22
|
|
7
23
|
def amazon_access_key_id
|
8
24
|
@amazon_access_key_id || ENV['AMAZON_ACCESS_KEY_ID']
|
@@ -11,6 +27,63 @@ module Ale
|
|
11
27
|
def amazon_secret_access_key
|
12
28
|
@amazon_secret_access_key || ENV['AMAZON_SECRET_ACCESS_KEY']
|
13
29
|
end
|
30
|
+
|
31
|
+
def ignored_files
|
32
|
+
@ignored_files ||= []
|
33
|
+
@ignored_files
|
34
|
+
end
|
35
|
+
|
36
|
+
def public_files
|
37
|
+
@public_files ||= []
|
38
|
+
@public_files
|
39
|
+
end
|
40
|
+
|
41
|
+
def private_files
|
42
|
+
@private_files ||= []
|
43
|
+
@private_files
|
44
|
+
end
|
45
|
+
|
46
|
+
def upload_strategy
|
47
|
+
@upload_strategy || :sync
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def configure_amazon!
|
53
|
+
AWS.config( :access_key_id => amazon_access_key_id,
|
54
|
+
:secret_access_key => amazon_secret_access_key )
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class DSL
|
59
|
+
def initialize
|
60
|
+
@ignored_files, @private_files, @public_files = [], [], []
|
61
|
+
end
|
62
|
+
|
63
|
+
def access_key(key)
|
64
|
+
Config.amazon_access_key_id = key
|
65
|
+
end
|
66
|
+
|
67
|
+
def bucket(bucket)
|
68
|
+
Config.bucket = bucket
|
69
|
+
end
|
70
|
+
|
71
|
+
def ignore(file)
|
72
|
+
Config.ignored_files << file
|
73
|
+
end
|
74
|
+
|
75
|
+
def private(file)
|
76
|
+
Config.private_files << file
|
77
|
+
end
|
78
|
+
|
79
|
+
def public(file)
|
80
|
+
Config.public_files << file
|
81
|
+
end
|
82
|
+
|
83
|
+
def secret_key(key)
|
84
|
+
Config.amazon_secret_access_key = key
|
85
|
+
end
|
14
86
|
end
|
15
87
|
end
|
88
|
+
|
16
89
|
end
|
data/lib/ale/site.rb
CHANGED
@@ -1,27 +1,28 @@
|
|
1
1
|
module Ale
|
2
2
|
module Site
|
3
3
|
class << self
|
4
|
-
def detect
|
5
|
-
return Jekyll if jekyll?
|
6
|
-
return Middleman if middleman?
|
7
|
-
return Base
|
4
|
+
def detect(directory)
|
5
|
+
return Jekyll.new(directory) if jekyll?(directory)
|
6
|
+
return Middleman.new(directory) if middleman?(directory)
|
7
|
+
return Base.new(directory)
|
8
8
|
end
|
9
9
|
|
10
|
-
def jekyll?
|
11
|
-
File.exists?(File.join(
|
10
|
+
def jekyll?(directory)
|
11
|
+
File.exists?(File.join(directory, '_config.yml'))
|
12
12
|
end
|
13
13
|
|
14
|
-
def middleman?
|
15
|
-
File.exists?(File.join(
|
14
|
+
def middleman?(directory)
|
15
|
+
File.exists?(File.join(directory, 'config.rb')) && File.directory?(File.join(directory, 'source'))
|
16
16
|
end
|
17
17
|
|
18
18
|
class Base
|
19
|
-
|
19
|
+
attr_reader :directory, :ignored_files, :private_files, :public_files
|
20
20
|
|
21
|
-
def initialize
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
def initialize(directory)
|
22
|
+
@directory = directory
|
23
|
+
@ignored_files = []
|
24
|
+
@private_files = ['Alefile']
|
25
|
+
@public_files = ['*', '*/*']
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
data/lib/ale/uploader.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Ale
|
4
|
+
# Upload
|
5
|
+
class Uploader
|
6
|
+
attr_reader :site
|
7
|
+
|
8
|
+
def initialize(site)
|
9
|
+
@site = site
|
10
|
+
end
|
11
|
+
|
12
|
+
def upload!
|
13
|
+
remove_stale_files_from_s3
|
14
|
+
send_local_files_to_s3
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def bucket
|
20
|
+
return @bucket unless @bucket.nil?
|
21
|
+
raise Ale::BucketNotSpecified if Ale::Config.bucket.empty?
|
22
|
+
@bucket = AWS::S3.new.buckets[Ale::Config.bucket]
|
23
|
+
raise Ale::BucketNotFound unless bucket.exists?
|
24
|
+
@bucket
|
25
|
+
end
|
26
|
+
|
27
|
+
def expand(files)
|
28
|
+
files.map do |file|
|
29
|
+
Dir["#{site.directory}/#{file}*"] +
|
30
|
+
Dir["#{site.directory}/#{file}*/*"]
|
31
|
+
end.flatten
|
32
|
+
end
|
33
|
+
|
34
|
+
def files
|
35
|
+
files = []
|
36
|
+
files += expand(site.public_files)
|
37
|
+
files -= expand(site.ignored_files)
|
38
|
+
files += expand(Ale::Config.public_files)
|
39
|
+
files += expand(Ale::Config.private_files)
|
40
|
+
files -= expand(Ale::Config.ignored_files)
|
41
|
+
files.compact.uniq
|
42
|
+
end
|
43
|
+
|
44
|
+
def key_name(file)
|
45
|
+
file.gsub("#{site.directory}/", '')
|
46
|
+
end
|
47
|
+
|
48
|
+
def permissions(file)
|
49
|
+
private_files.include?(file) ? :private : :public_read
|
50
|
+
end
|
51
|
+
|
52
|
+
def private_files
|
53
|
+
files = []
|
54
|
+
files += expand(site.private_files)
|
55
|
+
files -= expand(Ale::Config.public_files)
|
56
|
+
files += expand(Ale::Config.private_files)
|
57
|
+
files.compact.uniq
|
58
|
+
end
|
59
|
+
|
60
|
+
def remove_stale_files_from_s3
|
61
|
+
bucket.objects.each do |object|
|
62
|
+
unless files.include?("#{site.directory}/#{object.key}")
|
63
|
+
puts "Deleting old file #{object.key}"
|
64
|
+
object.delete
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def send_local_files_to_s3
|
70
|
+
files.each do |file|
|
71
|
+
unless File.directory?(file)
|
72
|
+
key = key_name(file)
|
73
|
+
object = bucket.objects[key]
|
74
|
+
if object.exists?
|
75
|
+
if object.last_modified < File.mtime(file)
|
76
|
+
puts "Updating file #{key}"
|
77
|
+
object.write(:file => file, :acl => permissions(file))
|
78
|
+
else
|
79
|
+
puts "File #{key} is already on S3"
|
80
|
+
end
|
81
|
+
else
|
82
|
+
puts "Uploading filed #{key}"
|
83
|
+
object.write(:file => file, :acl => permissions(file))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
data/lib/ale/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-09-08 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
16
|
-
requirement: &
|
16
|
+
requirement: &70294619028440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.1.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70294619028440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: thor
|
27
|
-
requirement: &
|
27
|
+
requirement: &70294619025320 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: 0.14.6
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70294619025320
|
36
36
|
description: Takes a static site and uploads it to Amazon's S3.
|
37
37
|
email: jeremy@jeremyboles.com
|
38
38
|
executables:
|
@@ -42,13 +42,14 @@ extra_rdoc_files: []
|
|
42
42
|
files:
|
43
43
|
- .gitignore
|
44
44
|
- Gemfile
|
45
|
+
- README.md
|
45
46
|
- ale.gemspec
|
46
47
|
- bin/ale
|
47
48
|
- lib/ale.rb
|
48
49
|
- lib/ale/cli.rb
|
49
50
|
- lib/ale/config.rb
|
50
|
-
- lib/ale/dsl.rb
|
51
51
|
- lib/ale/site.rb
|
52
|
+
- lib/ale/uploader.rb
|
52
53
|
- lib/ale/version.rb
|
53
54
|
homepage: https://github.com/jeremyboles/ale
|
54
55
|
licenses: []
|
data/lib/ale/dsl.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module Ale
|
2
|
-
class DSL
|
3
|
-
def self.evaluate(upfile)
|
4
|
-
builder = new
|
5
|
-
contents = File.open(upfile, 'rb') { |f| f.read }
|
6
|
-
builder.instance_eval(contents, upfile.to_s, 1)
|
7
|
-
end
|
8
|
-
|
9
|
-
def access_key(key)
|
10
|
-
Ale::Config.amazon_access_key_id = key
|
11
|
-
end
|
12
|
-
|
13
|
-
def bucket(bucket)
|
14
|
-
Ale::Config.bucket = bucket
|
15
|
-
end
|
16
|
-
|
17
|
-
def ignore(file)
|
18
|
-
puts file
|
19
|
-
end
|
20
|
-
|
21
|
-
def public(file)
|
22
|
-
puts file
|
23
|
-
end
|
24
|
-
|
25
|
-
def private(file)
|
26
|
-
puts file
|
27
|
-
end
|
28
|
-
|
29
|
-
def secret_key(key)
|
30
|
-
Ale::Config.amazon_secret_access_key = key
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|