flash_s3_rails 0.0.1.beta1

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.
@@ -0,0 +1,39 @@
1
+ module FlashS3
2
+ class AttachmentDefinition
3
+ REQUIRED_FIELDS = %w{bucket s3_access_key_id s3_secret_access_key}
4
+ OPTIONAL_FIELDS = {
5
+ 's3_bucket_acl' => 'public-read',
6
+ 's3_key_guid' => lambda { SecureRandom.hex },
7
+ 's3_key_path' => ''
8
+ }
9
+
10
+ attr_reader :name
11
+
12
+ def initialize(name)
13
+ @name = name
14
+ end
15
+
16
+ def valid?
17
+ (REQUIRED_FIELDS + OPTIONAL_FIELDS.keys).none? {|field| send(field).nil? }
18
+ end
19
+
20
+ def configure(&blk)
21
+ instance_eval(&blk)
22
+ end
23
+
24
+ def optional_field_default_value(field)
25
+ if field_val = OPTIONAL_FIELDS[field]
26
+ field_val.respond_to?(:call) ? field_val.call : field_val
27
+ end
28
+ end
29
+
30
+ (REQUIRED_FIELDS + OPTIONAL_FIELDS.keys).each do |field|
31
+ eval <<-EVAL
32
+ def #{field}(*args)
33
+ @#{field} = args.first if args.first
34
+ @#{field} || FlashS3.configuration.#{field}#{" || optional_field_default_value('#{field}')" if OPTIONAL_FIELDS.keys.include?(field)}
35
+ end
36
+ EVAL
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,13 @@
1
+ require 'rails'
2
+
3
+ module FlashS3
4
+ class Engine < ::Rails::Engine
5
+ config.flash_s3 = ActiveSupport::OrderedOptions.new
6
+
7
+ initializer 'flash_s3.insert_into_active_record' do
8
+ ActiveSupport.on_load :active_record do
9
+ ::ActiveRecord::Base.send(:include, Rails::ActiveRecord)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,80 @@
1
+ module FlashS3
2
+ class S3PostParams
3
+ def initialize(record, name)
4
+ @attachment_definition = record.send(name).attachment_definition
5
+ end
6
+
7
+ def params
8
+ {
9
+ "key" => s3_key,
10
+ "AWSAccessKeyId" => "#{s3_access_key_id}",
11
+ "acl" => "#{s3_bucket_acl}",
12
+ "policy" => "#{s3_policy}",
13
+ "signature" => "#{s3_signature}",
14
+ "success_action_status" => "201"
15
+ }
16
+ end
17
+
18
+ def s3_policy
19
+ @policy ||= Base64.encode64(
20
+ %Q%{'expiration': '#{expiration_date}',
21
+ 'conditions': [
22
+ {'bucket': '#{s3_bucket}'},
23
+ ['starts-with', '$key', "#{ s3_key_path.present? ? s3_key_path : ''}"],
24
+ {'acl': '#{s3_bucket_acl}'},
25
+ {'success_action_status': '201'},
26
+ ['content-length-range', 0, #{max_file_size}],
27
+ ['starts-with', '$Filename', '']
28
+ ]
29
+ }%
30
+ ).gsub(/\n|\r/, '')
31
+ end
32
+
33
+ def s3_signature
34
+ Base64.encode64(
35
+ OpenSSL::HMAC.digest(
36
+ OpenSSL::Digest::Digest.new('sha1'),
37
+ s3_secret_access_key, s3_policy)
38
+ ).gsub("\n","")
39
+ end
40
+
41
+ def s3_bucket
42
+ @attachment_definition.bucket
43
+ end
44
+
45
+ def s3_access_key_id
46
+ @attachment_definition.s3_access_key_id
47
+ end
48
+
49
+ def s3_secret_access_key
50
+ @attachment_definition.s3_secret_access_key
51
+ end
52
+
53
+ def expiration_date
54
+ 1.hour.from_now.utc.strftime('%Y-%m-%dT%H:%M:%S.000Z')
55
+ end
56
+
57
+ def max_file_size
58
+ 1000.megabytes
59
+ end
60
+
61
+ def s3_bucket_acl
62
+ @attachment_definition.s3_bucket_acl
63
+ end
64
+
65
+ def s3_key_guid
66
+ @attachment_definition.s3_key_guid
67
+ end
68
+
69
+ def s3_key_path
70
+ @attachment_definition.s3_key_path
71
+ end
72
+
73
+ def s3_key
74
+ key = "${filename}"
75
+ key = "#{s3_key_guid}_" + key if s3_key_guid.present?
76
+ key = "#{s3_key_path}/" + key if s3_key_path.present?
77
+ key
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,3 @@
1
+ module FlashS3
2
+ VERSION = "0.0.1.beta1"
3
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+ require 'rails_spec_helper'
3
+
4
+ describe Upload do
5
+ context 'when declaring an s3_upload without an environmental config', :without_env_config => true do
6
+ let(:upload) { Upload.new }
7
+
8
+ it 'should respond to upload=' do
9
+ upload.upload = {}
10
+ end
11
+
12
+ it 'should raise argument error with invalid keys' do
13
+ expect { upload.upload = {:junk => 'foo'} }.to raise_error(ArgumentError)
14
+ end
15
+
16
+ it 'the upload should be invalid' do
17
+ upload.upload.should_not be_valid
18
+ end
19
+
20
+ context 'and the bucket is not defined inline' do
21
+ it 'should not be valid if bucket is not configured globally' do
22
+ upload.upload.should_not be_valid
23
+ end
24
+
25
+ it 'should be valid if the configuration is defined with the module' do
26
+ FlashS3.configure do |config|
27
+ config.bucket = "foo"
28
+ config.s3_access_key_id = "bas"
29
+ config.s3_secret_access_key = "fubar"
30
+ end
31
+
32
+ upload.upload = {:s3_key => 'foo/bar.png'}
33
+
34
+ upload.upload.should be_valid
35
+ end
36
+ end
37
+
38
+ context 'and the bucket is defined inline' do
39
+ it 'the upload should be valid' do
40
+ upload.upload_with_block = {:s3_key => 'foo/bar.png'}
41
+ upload.upload_with_block.should be_valid
42
+ end
43
+ end
44
+
45
+ context 'with a valid s3_key' do
46
+ before do
47
+ upload.upload = {:s3_key => 'foo/bar.png'}
48
+ end
49
+
50
+ it 'should assisn the s3_key' do
51
+ upload.upload.s3_key.should == 'foo/bar.png'
52
+ end
53
+
54
+ it 'should save the s3_key if it has changed' do
55
+ upload.save
56
+ upload.upload_s3_key.should == 'foo/bar.png'
57
+ end
58
+ end
59
+ end
60
+
61
+ context 'when declaring an s3_upload with an environmental config' do
62
+ let(:upload) { Upload.new }
63
+
64
+
65
+ it 'should be valid if the configuration is defined from the rails environemnt configs' do
66
+ upload.upload = {:s3_key => 'foo/bar.png'}
67
+
68
+ upload.upload.should be_valid
69
+ upload.upload.bucket.should == 'bas'
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,32 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require 'flash_s3_test/config/environment'
4
+ require 'capybara/dsl'
5
+ require 'database_cleaner'
6
+ require 'rspec/rails'
7
+
8
+ include Capybara::DSL
9
+
10
+ Capybara.app = Rack::Builder.app do
11
+ run FlashS3Test::Application
12
+ end
13
+
14
+ Capybara.server do |app, port|
15
+ require 'rack/handler/mongrel'
16
+ Rack::Handler::Mongrel.run(app, :Port => port)
17
+ end
18
+
19
+ Capybara.default_driver = :selenium
20
+
21
+ DatabaseCleaner.strategy = :truncation
22
+
23
+ RSpec.configure do |config|
24
+ config.before(:each) do
25
+ DatabaseCleaner.start
26
+ end
27
+
28
+ config.after(:each) do
29
+ DatabaseCleaner.clean
30
+ end
31
+ end
32
+
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'rails_spec_helper'
3
+
4
+ describe "When uploading a file to s3" do
5
+ it "should boot the app" do
6
+ visit '/'
7
+ page.should have_content("Flash S3")
8
+ page.should have_selector("#upload_upload.flash_s3-wrapper")
9
+ ugh = find('#SWFUpload_0')
10
+ # ugh.native.send_keys(:enter)
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ require 'rspec'
2
+ require 'flash_s3'
3
+
4
+ include FlashS3
5
+
6
+ RSpec.configure do |config|
7
+ config.before(:all) do
8
+ @original_config = ::FlashS3.configuration.dup
9
+ end
10
+
11
+ config.after(:each) do
12
+ ::FlashS3.send(:configuration=, @original_config)
13
+ end
14
+
15
+ config.before(:each) do
16
+ ::FlashS3.configuration.clear if example.metadata[:without_env_config] == true
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,204 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flash_s3_rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.beta1
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Sam Woodard
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70298583715520 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70298583715520
25
+ - !ruby/object:Gem::Dependency
26
+ name: thin
27
+ requirement: &70298583714060 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70298583714060
36
+ - !ruby/object:Gem::Dependency
37
+ name: capybara
38
+ requirement: &70298583711100 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70298583711100
47
+ - !ruby/object:Gem::Dependency
48
+ name: mongrel
49
+ requirement: &70298583709500 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.2.0.pre2
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70298583709500
58
+ - !ruby/object:Gem::Dependency
59
+ name: database_cleaner
60
+ requirement: &70298583707740 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70298583707740
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: &70298583706400 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70298583706400
80
+ - !ruby/object:Gem::Dependency
81
+ name: rails
82
+ requirement: &70298583705180 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70298583705180
91
+ - !ruby/object:Gem::Dependency
92
+ name: sqlite3
93
+ requirement: &70298583703900 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70298583703900
102
+ - !ruby/object:Gem::Dependency
103
+ name: jquery-rails
104
+ requirement: &70298583702980 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70298583702980
113
+ - !ruby/object:Gem::Dependency
114
+ name: activesupport
115
+ requirement: &70298583699820 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: *70298583699820
124
+ - !ruby/object:Gem::Dependency
125
+ name: jquery-ui-rails
126
+ requirement: &70298583699120 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: *70298583699120
135
+ description: Direct multi-file uploader to s3
136
+ email:
137
+ - sam.h.woodard@gmail.com
138
+ executables: []
139
+ extensions: []
140
+ extra_rdoc_files: []
141
+ files:
142
+ - .gitignore
143
+ - .rspec
144
+ - Gemfile
145
+ - Gemfile.lock
146
+ - README.md
147
+ - Rakefile
148
+ - app/assets/images/vendor/flash_s3/start_button.png
149
+ - app/assets/images/vendor/flash_s3/swfupload.swf
150
+ - app/assets/images/vendor/flash_s3/upload_button.png
151
+ - app/assets/javascripts/jquery.flashS3.js
152
+ - app/assets/javascripts/vendor/flash_s3/swfupload.fileprogress.js
153
+ - app/assets/javascripts/vendor/flash_s3/swfupload.handlers.js
154
+ - app/assets/javascripts/vendor/flash_s3/swfupload.js
155
+ - app/assets/javascripts/vendor/flash_s3/swfupload.queue.js
156
+ - app/assets/javascripts/vendor/flash_s3/swfupload.swfobject.js
157
+ - app/assets/stylesheets/jquery.flashS3.css
158
+ - app/helpers/flash_s3_helper.rb
159
+ - app/views/flash_s3/_flash_s3_uploader.html.erb
160
+ - app/views/layouts/_flash_s3.html.erb
161
+ - config/routes.rb
162
+ - flash_s3.gemspec
163
+ - lib/flash_s3.rb
164
+ - lib/flash_s3/attachment.rb
165
+ - lib/flash_s3/attachment_definition.rb
166
+ - lib/flash_s3/engine.rb
167
+ - lib/flash_s3/s3_post_params.rb
168
+ - lib/flash_s3/version.rb
169
+ - spec/models/upload_spec.rb
170
+ - spec/rails_spec_helper.rb
171
+ - spec/requests/new_upload_spec.rb
172
+ - spec/spec_helper.rb
173
+ homepage: ''
174
+ licenses: []
175
+ post_install_message:
176
+ rdoc_options: []
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ none: false
181
+ requirements:
182
+ - - ! '>='
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ segments:
186
+ - 0
187
+ hash: 1035574372849630356
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ! '>'
192
+ - !ruby/object:Gem::Version
193
+ version: 1.3.1
194
+ requirements: []
195
+ rubyforge_project: flash_s3
196
+ rubygems_version: 1.8.15
197
+ signing_key:
198
+ specification_version: 3
199
+ summary: Direct multi-file uploader to s3
200
+ test_files:
201
+ - spec/models/upload_spec.rb
202
+ - spec/rails_spec_helper.rb
203
+ - spec/requests/new_upload_spec.rb
204
+ - spec/spec_helper.rb