ale 0.0.1 → 0.0.2
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.
- 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
|