Class: Datapimp::Sync::S3Bucket
- Inherits:
-
Hashie::Mash
- Object
- Hashie::Mash
- Datapimp::Sync::S3Bucket
- Includes:
- Logging
- Defined in:
- lib/datapimp/sync/s3_bucket.rb
Instance Method Summary collapse
- #asset_fingerprints ⇒ Object
- #build_deploy_manifest_from_remote ⇒ Object
- #cloudfront ⇒ Object
- #deploy_manifest ⇒ Object
- #deploy_manifest_path ⇒ Object
- #local_path ⇒ Object
-
#prepare_manifest_for(entries) ⇒ Object
builds a manifest of MD5 hashes for each file so that we aren’t deploying stuff which is the same since last time we deployed.
- #run(action, options = {}) ⇒ Object
- #run_create_action(options = {}) ⇒ Object
- #run_pull_action(options = {}) ⇒ Object
- #run_push_action(options = {}) ⇒ Object
- #run_update_acl_action(options = {}) ⇒ Object
-
#s3 ⇒ Object
returns the s3 bucket via fog.
- #storage ⇒ Object
- #website_hostname ⇒ Object
- #website_url(proto = "http") ⇒ Object
Methods included from Logging
Instance Method Details
#asset_fingerprints ⇒ Object
71 72 73 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 71 def asset_fingerprints deploy_manifest['asset_fingerprints'] ||= {} end |
#build_deploy_manifest_from_remote ⇒ Object
51 52 53 54 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 51 def build_deploy_manifest_from_remote # TODO # Implement end |
#cloudfront ⇒ Object
21 22 23 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 21 def cloudfront @cloudfront ||= Datapimp::Sync::CloudfrontDistribution.new(bucket: remote) end |
#deploy_manifest ⇒ Object
47 48 49 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 47 def deploy_manifest @deploy_manifest ||= (JSON.parse(deploy_manifest_path.read) || {} rescue {}) end |
#deploy_manifest_path ⇒ Object
41 42 43 44 45 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 41 def deploy_manifest_path Datapimp.config.deploy_manifests_path .tap {|p| FileUtils.mkdir_p(p) } .join(remote.to_s.parameterize + '.json') end |
#local_path ⇒ Object
37 38 39 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 37 def local_path Pathname(local) end |
#prepare_manifest_for(entries) ⇒ Object
builds a manifest of MD5 hashes for each file so that we aren’t deploying stuff which is the same since last time we deployed
59 60 61 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 59 def prepare_manifest_for(entries) deploy_manifest end |
#run(action, options = {}) ⇒ Object
142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 142 def run(action, ={}) action = action.to_sym if action == :push run_push_action() elsif action == :create run_create_action() elsif action == :update_acl run_update_acl_action(={}) elsif action == :pull run_pull_action end end |
#run_create_action(options = {}) ⇒ Object
128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 128 def run_create_action(={}) directories = Datapimp::Sync.amazon.storage.directories bucket = if existing = directories.get(remote) existing else directories.create(key:remote, public: true) end storage.put_bucket_website(remote, :IndexDocument => 'index.html', :ErrorDocument => 'error.html') bucket end |
#run_pull_action(options = {}) ⇒ Object
124 125 126 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 124 def run_pull_action(={}) end |
#run_push_action(options = {}) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 75 def run_push_action(={}) require 'rack' unless defined?(::Rack) entries = Dir[local_path.join('**/*')].map(&:to_pathname) prepare_manifest_for(entries) entries.reject! { |entry| entry.to_s.match(/\.DS_Store/) } entries.reject!(&:directory?) uploaded = deploy_manifest['uploaded'] = [] entries.each do |entry| destination = entry.relative_path_from(local_path).to_s.without_leading_slash fingerprint = Digest::MD5.hexdigest(entry.read) if asset_fingerprints[destination] == fingerprint #log "Skipping #{ destination }: found in manifest" next end content_type = Rack::Mime.mime_type(File.extname(destination.split("/").last)) if existing = s3.files.get(destination) if existing.etag == fingerprint log "Skipping #{ destination }: similar etag" else existing.body = entry.read existing.acl = 'public-read' existing.content_type = content_type log "Updated #{ destination }; content-type: #{ content_type }" uploaded << destination existing.save end else log "Uploaded #{ destination }; content-type: #{ content_type }" s3.files.create(key: destination, body: entry.read, acl: 'public-read', content_type: content_type) uploaded << destination end asset_fingerprints[destination] = fingerprint end if count == 0 return end log "Saving deploy manifest. #{ deploy_manifest.keys.length } entries" deploy_manifest_path.open("w+") {|fh| fh.write(deploy_manifest.to_json) } end |
#run_update_acl_action(options = {}) ⇒ Object
63 64 65 66 67 68 69 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 63 def run_update_acl_action(={}) s3.files.each do |file| file.acl = 'public-read' file.save log "Updated acl for #{ file.key } to public-read" end end |
#s3 ⇒ Object
returns the s3 bucket via fog
7 8 9 10 11 12 13 14 15 16 17 18 19 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 7 def s3 @s3 ||= storage.directories.get(remote).tap do |bucket| if setup_website == true bucket.public = true bucket.save storage.put_bucket_website(remote, 'index.html', key: 'error.html') end if redirect == true log "Should be creating a redirect bucket" end end end |
#storage ⇒ Object
25 26 27 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 25 def storage Datapimp::Sync.amazon.storage end |
#website_hostname ⇒ Object
29 30 31 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 29 def website_hostname "#{s3.key}.s3-website-#{ s3.location }.amazonaws.com" end |
#website_url(proto = "http") ⇒ Object
33 34 35 |
# File 'lib/datapimp/sync/s3_bucket.rb', line 33 def website_url(proto="http") "#{proto}://#{ website_hostname }" end |