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