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 ADDED
@@ -0,0 +1,8 @@
1
+ Ale
2
+ ===
3
+
4
+ Deploy static sites to S3 after having a few.
5
+ ---------------------------------------------
6
+
7
+
8
+
data/bin/ale CHANGED
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  $:.push File.expand_path("../../lib", __FILE__)
4
- require 'ale'
5
3
 
4
+ require 'ale'
6
5
  Ale::CLI.start
data/lib/ale.rb CHANGED
@@ -1,19 +1,22 @@
1
1
  module Ale
2
- autoload :CLI, 'ale/cli'
3
- autoload :Config, 'ale/config'
4
- autoload :DSL, 'ale/dsl'
5
- autoload :Site, 'ale/site'
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
- def config!
9
- AWS.config({
10
- :access_key_id => Config.amazon_access_key_id,
11
- :secret_access_key => Config.amazon_secret_access_key
12
- })
8
+ attr_writer :alefile, :root
9
+
10
+ def alefile
11
+ @alefile || File.join(root, 'Alefile')
13
12
  end
14
13
 
15
- def directory
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', 'Builds the site'
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
- say("Detect: #{Site.detect}")
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
- if File.exists?(upfile)
18
- DSL.evaluate(upfile)
19
- Ale.config!
20
- bucket = AWS::S3.new.buckets['www.bloomapp.net']
21
-
22
- say("Starting upload to #{bucket.name}")
23
- directory = File.expand_path(Ale.directory)
24
- Dir["#{directory}/**/*"].each do |file|
25
- unless File.directory?(file)
26
- key = file.gsub('./', '')
27
- say("Uploading #{key}")
28
- object = bucket.objects[key]
29
- object.write(:file => file, :acl => :public_read)
30
- end
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
- def upfile
46
- upfile = File.join(Ale.directory, 'Upfile')
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(Up.directory, '_config.yml'))
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(Up.directory, 'config.rb')) && File.directory?(File.join(Up.directory, 'source'))
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
- attr_accessor :ignored_files, :private_files, :public_files
19
+ attr_reader :directory, :ignored_files, :private_files, :public_files
20
20
 
21
- def initialize
22
- ignored_files = []
23
- private_files = ['Upfile']
24
- public_files = []
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
 
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Ale
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
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.1
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: &70257830900780 !ruby/object:Gem::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: *70257830900780
24
+ version_requirements: *70294619028440
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: thor
27
- requirement: &70257830899900 !ruby/object:Gem::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: *70257830899900
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