anaconda 0.0.3 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1607eb100c23426c78fc3be127fcea5ff7062510
4
- data.tar.gz: 1a50a5e1fea15bb4055e1ef3f8b16806d2526527
3
+ metadata.gz: 7fdbbf12ffefec5c116f99be38fc11d908ba60a9
4
+ data.tar.gz: 9320e3c6cdef34e2e968c668b357dba366d37914
5
5
  SHA512:
6
- metadata.gz: 319a37f584909a3187783e83b064bcc6a3a624b497a23cbfc7e25340dd512223515509783414756d5c848ef143d9de283689a72f2796d8ffcb72dc4c376b5f13
7
- data.tar.gz: b3398c2a3895086e72ea43acc9face25564403f39d5724ed6a1afd57c49b1dad16b46a2dfa7ab253ebaba8806cee0fa6ddd17d85bde19c032d0379e665db7cfe
6
+ metadata.gz: 36c1eb4ac4d6597b285edcee1a5502af3f95b4bb24dbc00c8a2143afe6f20547641c4798246a238e6fcf9afece4f4c37f5a26e99258039eb49d1b85a3e85e7b0
7
+ data.tar.gz: 12ace30c835230a065e6ea66fee390d79f37e8533bba47c2bf2817e48f8f3b49619ea8c57c62bad1aa568965325ce90a673d63e43698477480c28ccea49c55ae
data/README.markdown CHANGED
@@ -10,20 +10,98 @@ If you require stability before that time, you are strongly encouraged to specif
10
10
 
11
11
  ## Installation
12
12
 
13
- Add to your `Gemfile`
13
+ 1. Add to your `Gemfile`
14
14
 
15
- gem 'anaconda'
15
+ gem 'anaconda'
16
16
 
17
- Then `bundle install`
17
+ 2. `bundle install`
18
18
 
19
- * Asset updates
20
- * AWS setup
19
+ 3. Add the following to your `application.js`
20
+
21
+ //= require anaconda
22
+
23
+ 4. Finally, run the installer to install the configuration initializer into `config/initializers/anaconda.rb`
24
+
25
+ $ rails g anaconda:install
26
+
27
+ ## Configuration
28
+
29
+ ### AWS S3 Setup
30
+
31
+ ### AWS S3 Setup
32
+
33
+ #### IAM
34
+
35
+ Sample IAM Policy (be sure to replace 'your.bucketname'):
36
+
37
+ {
38
+ "Statement": [
39
+ {
40
+ "Effect": "Allow",
41
+ "Action": "s3:*",
42
+ "Resource": [
43
+ "arn:aws:s3:::[your.bucketname]",
44
+ "arn:aws:s3:::[your.bucketname]/*"
45
+ ]
46
+ }
47
+ ]
48
+ }
49
+
50
+ #### CORS
51
+
52
+ Sample CORS configuration:
53
+
54
+ <?xml version="1.0" encoding="UTF-8"?>
55
+ <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
56
+ <CORSRule>
57
+ <AllowedOrigin>*</AllowedOrigin>
58
+ <AllowedMethod>GET</AllowedMethod>
59
+ <AllowedMethod>POST</AllowedMethod>
60
+ <AllowedMethod>PUT</AllowedMethod>
61
+ <MaxAgeSeconds>3000</MaxAgeSeconds>
62
+ <AllowedHeader>*</AllowedHeader>
63
+ </CORSRule>
64
+ </CORSConfiguration>
65
+
66
+
67
+ ### Initializer
68
+
69
+ The initializer installed into `config/initializers/anaconda.rb` contains the settings you need to get anaconda working.
70
+
71
+ **You must set these to your S3 credentials/settings in order for anaconda to work.**
72
+
73
+ We highly recommend the `figaro` gem [https://github.com/laserlemon/figaro](https://github.com/laserlemon/figaro) to manage your environment variables in development and production.
21
74
 
22
75
  ## Usage
23
76
 
24
- * Controller changes (if any)
25
- * Form setup
26
- * Options
77
+ * Controller changes (if any)
78
+
79
+ * Migrations
80
+
81
+ $ rails g migration anaconda:migration PostMedia asset
82
+
83
+ * Model setup
84
+
85
+ class PostMedia < ActiveRecord::Base
86
+ belongs_to :post
87
+
88
+ anaconda_for :asset, base_key: :asset_key
89
+
90
+ def asset_key
91
+ o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten
92
+ s = (0...24).map { o[rand(o.length)] }.join
93
+ "post_media/#{s}"
94
+ end
95
+
96
+
97
+
98
+ * Form setup
99
+
100
+ #anaconda_upload_form_wrapper
101
+ = anaconda_uploader_form_for post_media, :asset, form_el: '#new_post_media', limits: { images: 9999 }, auto_upload: true
102
+
103
+
104
+ * Options
27
105
 
28
106
  ## Contributing to anaconda
29
107
 
@@ -8,6 +8,7 @@ class @AnacondaUploader
8
8
 
9
9
 
10
10
  constructor: (options = {}) ->
11
+ @element_id = options.element_id ? ""
11
12
  @limits = options.limits ? {}
12
13
  @allowed_types = options.allowed_types ? []
13
14
  @upload_details_container = $("##{options.upload_details_container}") ? $("#files")
@@ -19,13 +20,12 @@ class @AnacondaUploader
19
20
  @attribute = options.attribute ? null
20
21
 
21
22
  @files_for_upload = []
22
- @base_key = $("#fileupload").data("base-key")
23
+ @base_key = options.base_key ? ""
23
24
  @setup_fileupload()
24
- @setup_upload_button_handler()
25
25
 
26
26
  setup_fileupload: ->
27
27
  self = this
28
- $('#fileupload').fileupload
28
+ $( @element_id ).fileupload
29
29
  dropZone: $("#dropzone")
30
30
  add: (e, data) ->
31
31
  self.add_file data
@@ -41,20 +41,34 @@ class @AnacondaUploader
41
41
  fail: (e, data) ->
42
42
  alert("#{data.files[0].name} failed to upload.")
43
43
  DLog("Upload failed:")
44
+ DLog("Error:")
44
45
  DLog(e)
46
+ DLog("data:")
45
47
  DLog(data)
48
+ DLog("data.errorThrown:")
46
49
  DLog(data.errorThrown )
50
+ DLog("data.textStatus:")
47
51
  DLog(data.textStatus )
52
+ DLog("data.jqXHR:")
48
53
  DLog(data.jqXHR )
49
54
 
50
55
  $(document).bind 'drop dragover', (e) ->
51
56
  e.preventDefault()
52
57
 
53
58
  setup_upload_button_handler: ->
54
- self = this
55
- @upload_button.off("click").click (e) ->
56
- e.preventDefault()
57
- self.upload_files()
59
+ #alert( "setup_upload_button_handler for #{@element_id}" )
60
+ unless ( @upload_automatically == true )
61
+ DLog( "Setting up submit handler for element #{@element_id}")
62
+ $(@element_id).closest( 'form' ).on( 'submit', { self: this }, this.form_submit_handler )
63
+
64
+ form_submit_handler: (e) ->
65
+ # alert( 'form_submit_handler' )
66
+ e.preventDefault()
67
+ self = e.data.self
68
+ $(this).off( 'submit', self.form_submit_handler )
69
+
70
+ self.files_for_upload[0].submit()
71
+ false
58
72
 
59
73
  files_by_type: (type) ->
60
74
  matches = []
@@ -91,9 +105,11 @@ class @AnacondaUploader
91
105
  DLog(upload_file)
92
106
  @upload_details_container.append "<div id='upload_file_#{upload_file.id}' class='upload-file #{upload_file.media_type}'><span class='file-name'>#{upload_file.file.name}</span><span class='size'>#{upload_file.file.size}</span><span class='progress-percent'></span><div class='progress'><span class='progress-bar'></span></div></div>"
93
107
 
94
- if @upload_automatically
108
+ if @upload_automatically == true
109
+ DLog( "Upload Automatically: #{@upload_automatically}")
95
110
  upload_file.submit()
96
-
111
+ else
112
+ @setup_upload_button_handler()
97
113
  else
98
114
  alert "Only #{@limits[upload_file.media_type]} #{upload_file.media_type} files are allowed"
99
115
  else
@@ -103,36 +119,36 @@ class @AnacondaUploader
103
119
  DLog "#{upload_file.file.name} completed uploading"
104
120
  DLog upload_file
105
121
 
106
- if @upload_complete_post_url? && @upload_complete_post_url != ""
107
- DLog "will now post to #{@upload_complete_post_url}"
108
-
109
- file_data = {}
110
- file_data[@resource] = {}
111
- file_data[@resource]["#{@attribute}_file_path"] = "#{@base_key}/#{upload_file.file.name}"
112
- file_data[@resource]["#{@attribute}_filename"] = upload_file.file.name
113
- file_data[@resource]["#{@attribute}_size"] = upload_file.file.size
114
- file_data[@resource]["#{@attribute}_type"] = upload_file.file.media_type
115
- upload_file = this
116
- $.ajax({
117
- type: 'PATCH',
118
- url: @upload_complete_post_url,
119
- data: $.param(file_data)
120
- success: (data, textStatus, jqXHR) ->
121
- DLog "file completed handler complete"
122
- DLog data
123
- #TODO: handle a failure on this POST
124
- })
125
-
126
- if @upload_complete_form_to_fill? && @upload_complete_form_to_fill != ""
127
- DLog "will now fill form #{@upload_complete_form_to_fill}"
128
-
129
- DLog "#{@resource}_#{@attribute}_file_path"
130
-
131
- $( @upload_complete_form_to_fill + ' ' + '#' + "#{@resource}_#{@attribute}_file_path" ).val( "#{@base_key}/#{upload_file.file.name}" )
132
- $( @upload_complete_form_to_fill + ' ' + '#' + "#{@resource}_#{@attribute}_filename" ).val( upload_file.file.name )
133
- $( @upload_complete_form_to_fill + ' ' + '#' + "#{@resource}_#{@attribute}_size" ).val( upload_file.file.size )
134
- $( @upload_complete_form_to_fill + ' ' + '#' + "#{@resource}_#{@attribute}_type" ).val( upload_file.file.type )
135
-
122
+ # if @upload_complete_post_url? && @upload_complete_post_url != ""
123
+ # DLog "will now post to #{@upload_complete_post_url}"
124
+ #
125
+ # file_data = {}
126
+ # file_data[@resource] = {}
127
+ # file_data[@resource]["#{@attribute}_file_path"] = "#{@base_key}/#{upload_file.file.name}"
128
+ # file_data[@resource]["#{@attribute}_filename"] = upload_file.file.name
129
+ # file_data[@resource]["#{@attribute}_size"] = upload_file.file.size
130
+ # file_data[@resource]["#{@attribute}_type"] = upload_file.file.media_type
131
+ # upload_file = this
132
+ # $.ajax({
133
+ # type: 'PATCH',
134
+ # url: @upload_complete_post_url,
135
+ # data: $.param(file_data)
136
+ # success: (data, textStatus, jqXHR) ->
137
+ # DLog "file completed handler complete"
138
+ # DLog data
139
+ # #TODO: handle a failure on this POST
140
+ # })
141
+
142
+ DLog "will now fill form #{@upload_complete_form_to_fill}"
143
+
144
+ DLog "#{@resource}_#{@attribute}_file_path"
145
+
146
+ $( @element_id ).siblings( '#' + "#{@resource}_#{@attribute}_file_path" ).val( "#{@base_key}/#{upload_file.file.name}" )
147
+ $( @element_id ).siblings( '#' + "#{@resource}_#{@attribute}_filename" ).val( upload_file.file.name )
148
+ $( @element_id ).siblings( '#' + "#{@resource}_#{@attribute}_size" ).val( upload_file.file.size )
149
+ $( @element_id ).siblings( '#' + "#{@resource}_#{@attribute}_type" ).val( upload_file.file.type )
150
+
151
+ $( @element_id ).closest( 'form' ).submit() unless ( @upload_automatically == true )
136
152
 
137
153
  class @AnacondaUploadFile
138
154
 
@@ -1,6 +1,4 @@
1
- = anaconda_uploader_form options
2
-
3
- %button#upload Upload
1
+ / Moved to form_builder_helpers.rb
4
2
 
5
3
  %strong Files:
6
4
  #files
@@ -15,7 +13,8 @@
15
13
  resource: 1,
16
14
  image: 1
17
15
  },
18
- allowed_types: ["image"],
16
+ element_id: "#{option[:element_id]}"
17
+ allowed_types: [],
19
18
  upload_details_container: "files",
20
19
  upload_button_id: "upload",
21
20
  upload_complete_post_url: "#{options[:form_options][:post_url]}",
data/lib/anaconda.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'rails'
1
2
  require 'anaconda/anaconda'
2
3
  require 'anaconda/anaconda_for'
3
4
  require 'anaconda/railtie'
@@ -7,3 +8,18 @@ require 'anaconda/version'
7
8
  ActiveSupport.on_load(:active_record) do
8
9
  include Anaconda::Model
9
10
  end
11
+
12
+ module Anaconda
13
+ mattr_accessor :aws
14
+ @@aws = {
15
+ aws_access_key: "",
16
+ aws_secret_key: "",
17
+ aws_bucket: ""
18
+ }
19
+
20
+ # Default way to setup Anaconda. Run rails generate anaconda:install
21
+ # to create a fresh initializer with all configuration values.
22
+ def self.config
23
+ yield self
24
+ end
25
+ end
@@ -6,20 +6,20 @@ module Anaconda
6
6
  end
7
7
 
8
8
  module ClassMethods
9
-
9
+
10
10
  def anaconda_for( anaconda_columns, options = {})
11
11
  send :include, InstanceMethods
12
-
12
+
13
13
  anaconda_columns = [anaconda_columns] if anaconda_columns.kind_of?(Symbol) || anaconda_columns.kind_of?(String)
14
14
  class_attribute :anaconda_columns
15
15
  self.anaconda_columns = anaconda_columns.collect{ |c| c.to_sym }
16
16
  # Class.anaconda_columns is now an array of symbols
17
-
17
+
18
18
  class_attribute :anaconda_options
19
19
  self.anaconda_options = options.reverse_merge(
20
- aws_access_key_id: AWS[:aws_access_key],
21
- aws_secret_access_key: AWS[:aws_secret_key],
22
- bucket: AWS[:aws_bucket],
20
+ aws_access_key_id: Anaconda.aws[:aws_access_key],
21
+ aws_secret_access_key: Anaconda.aws[:aws_secret_key],
22
+ bucket: Anaconda.aws[:aws_bucket],
23
23
  acl: "public-read",
24
24
  max_file_size: 500.megabytes,
25
25
  base_key: "#{self.to_s.pluralize.downcase}/#{anaconda_columns.first.to_s.pluralize}/#{(0...32).map{(65+rand(26)).chr}.join.downcase}"
@@ -27,7 +27,7 @@ module Anaconda
27
27
  end
28
28
  end
29
29
  module InstanceMethods
30
- def method_missing(method, *args, &block)
30
+ def method_missing(method, *args, &block)
31
31
  checking_column = checking_method = nil
32
32
  if self.class.anaconda_columns.present? && self.class.anaconda_columns.any? do |column|
33
33
  checking_column = column
@@ -46,14 +46,16 @@ module Anaconda
46
46
  super
47
47
  end
48
48
  end
49
-
49
+
50
50
  private
51
51
  def magic_url(column_name)
52
+ nil unless send("#{column_name}_file_path").present?
53
+
52
54
  if send("#{column_name}_stored_privately")
53
- aws = Fog::Storage.new({:provider => 'AWS', :aws_access_key_id => AWS[:aws_access_key], :aws_secret_access_key => AWS[:aws_secret_key]})
54
- aws.get_object_https_url(AWS[:aws_bucket], send("#{column_name}_file_path"), 1.hour.from_now)
55
+ aws = Fog::Storage.new({:provider => 'AWS', :aws_access_key_id => Anaconda.aws[:aws_access_key], :aws_secret_access_key => Anaconda.aws[:aws_secret_key]})
56
+ aws.get_object_https_url(Anaconda.aws[:aws_bucket], send("#{column_name}_file_path"), 1.hour.from_now)
55
57
  else
56
- "https://s3.amazonaws.com/#{AWS[:aws_bucket]}/#{send("#{column_name}_file_path")}"
58
+ "https://s3.amazonaws.com/#{Anaconda.aws[:aws_bucket]}/#{send("#{column_name}_file_path")}"
57
59
  end
58
60
  end
59
61
  end
@@ -0,0 +1,147 @@
1
+ module Anaconda
2
+ module FormBuilderHelpers
3
+
4
+ def anaconda( anaconda_field_name, form_options = {} )
5
+ output = ""
6
+ instance = nil
7
+ options = {}
8
+
9
+ element_id = "anaconda_file_#{anaconda_field_name}"
10
+
11
+ if self.class == SimpleForm::FormBuilder
12
+ instance = self.object
13
+ a_class = self.object.class unless self.object.kind_of? Class
14
+
15
+ options = a_class.anaconda_options.dup
16
+ options[:base_key] = instance.send(options[:base_key].to_s) if options[:base_key].kind_of? Symbol
17
+
18
+ uploader = S3Uploader.new(options)
19
+
20
+ output += self.input_field "file", name: "file", id: element_id, as: :file, "data-url" => uploader.url, "data-form-data" => uploader.fields.to_json
21
+ end
22
+
23
+ output += self.hidden_field "#{anaconda_field_name}_filename".to_sym
24
+ output += self.hidden_field "#{anaconda_field_name}_file_path".to_sym
25
+ output += self.hidden_field "#{anaconda_field_name}_size".to_sym
26
+ output += self.hidden_field "#{anaconda_field_name}_original_filename".to_sym
27
+ output += self.hidden_field "#{anaconda_field_name}_stored_privately".to_sym
28
+ output += self.hidden_field "#{anaconda_field_name}_type".to_sym
29
+
30
+ # output += render(:template =>"anaconda/_uploader_form_for.html.haml", :locals => {resource: instance, options: options.merge(as: anaconda_field_name, form_options: form_options, element_id: element_id )}, layout: false).to_s
31
+
32
+ options = options.merge(as: anaconda_field_name, form_options: form_options, element_id: element_id )
33
+
34
+ output += <<-END
35
+ <strong>Files:</strong>
36
+
37
+ <div id="files"></div>
38
+
39
+ <script>
40
+ (function() {
41
+ jQuery(function() {
42
+ return window.uploader = new AnacondaUploader({
43
+ limits: {
44
+ audio: 1,
45
+ video: 1,
46
+ resource: 1,
47
+ image: 1
48
+ },
49
+ element_id: "##{options[:element_id]}",
50
+ base_key: "#{options[:base_key]}",
51
+ allowed_types: [],
52
+ upload_details_container: "files",
53
+ upload_button_id: "upload",
54
+ upload_complete_post_url: "#{options[:form_options][:post_url]}",
55
+ upload_complete_form_to_fill: "#{options[:form_options][:form_el]}",
56
+ upload_automatically: "#{options[:form_options][:auto_upload]}",
57
+ resource: "#{instance.class.to_s.underscore}",
58
+ attribute: "#{options[:as]}"
59
+ });
60
+ });
61
+
62
+ }).call(this);
63
+ </script>
64
+
65
+ END
66
+
67
+ output.html_safe
68
+ end
69
+
70
+ class S3Uploader
71
+ def initialize(options)
72
+ @options = options.reverse_merge(
73
+ id: "fileupload",
74
+ aws_access_key_id: Anaconda.aws[:aws_access_key],
75
+ aws_secret_access_key: Anaconda.aws[:aws_secret_key],
76
+ bucket: Anaconda.aws[:aws_bucket],
77
+ acl: "public-read",
78
+ expiration: 10.hours.from_now,
79
+ max_file_size: 500.megabytes,
80
+ as: "file"
81
+ )
82
+ end
83
+
84
+ def form_options
85
+ {
86
+ id: @options[:id],
87
+ method: "post",
88
+ authenticity_token: false,
89
+ multipart: true,
90
+ data: {
91
+ post: @options[:post],
92
+ as: @options[:as],
93
+ base_key: base_key
94
+ }
95
+ }
96
+ end
97
+
98
+ def fields
99
+ {
100
+ :key => key,
101
+ :acl => @options[:acl],
102
+ :policy => policy,
103
+ :signature => signature,
104
+ "AWSAccessKeyId" => @options[:aws_access_key_id],
105
+ }
106
+ end
107
+
108
+ def key
109
+ @key ||= "#{base_key}/${filename}"
110
+ end
111
+
112
+ def base_key
113
+ @options[:base_key]
114
+ end
115
+
116
+ def url
117
+ "https://s3.amazonaws.com/#{@options[:bucket]}/"
118
+ end
119
+
120
+ def policy
121
+ Base64.encode64(policy_data.to_json).gsub("\n", "")
122
+ end
123
+
124
+ def policy_data
125
+ {
126
+ expiration: @options[:expiration],
127
+ conditions: [
128
+ #["starts-with", "$utf8", ""],
129
+ ["starts-with", "$key", base_key],
130
+ ["content-length-range", 1, @options[:max_file_size]],
131
+ {bucket: @options[:bucket]},
132
+ {acl: @options[:acl]}
133
+ ]
134
+ }
135
+ end
136
+
137
+ def signature
138
+ Base64.encode64(
139
+ OpenSSL::HMAC.digest(
140
+ OpenSSL::Digest::Digest.new('sha1'),
141
+ @options[:aws_secret_access_key], policy
142
+ )
143
+ ).gsub("\n", "")
144
+ end
145
+ end
146
+ end
147
+ end
@@ -1,10 +1,13 @@
1
1
  require 'rails/railtie'
2
2
  require 'anaconda/upload_helper'
3
+ require 'anaconda/form_builder_helpers'
3
4
 
4
5
  module Anaconda
5
6
  class Railtie < ::Rails::Railtie
6
7
  initializer "anaconda.upload_helper" do
7
8
  ActionView::Base.send :include, UploadHelper
9
+ ActionView::Helpers::FormBuilder.send :include, FormBuilderHelpers
10
+ SimpleForm::FormBuilder.send :include, FormBuilderHelpers if SimpleForm::FormBuilder
8
11
  end
9
12
  end
10
13
  end
@@ -20,9 +20,9 @@ module Anaconda
20
20
  def initialize(options)
21
21
  @options = options.reverse_merge(
22
22
  id: "fileupload",
23
- aws_access_key_id: AWS[:aws_access_key],
24
- aws_secret_access_key: AWS[:aws_secret_key],
25
- bucket: AWS[:aws_bucket],
23
+ aws_access_key_id: Anaconda.aws[:aws_access_key],
24
+ aws_secret_access_key: Anaconda.aws[:aws_secret_key],
25
+ bucket: Anaconda.aws[:aws_bucket],
26
26
  acl: "public-read",
27
27
  expiration: 10.hours.from_now,
28
28
  max_file_size: 500.megabytes,
@@ -57,11 +57,11 @@ module Anaconda
57
57
  def key
58
58
  @key ||= "#{base_key}/${filename}"
59
59
  end
60
-
60
+
61
61
  def base_key
62
62
  @options[:base_key]
63
63
  end
64
-
64
+
65
65
  def url
66
66
  "https://s3.amazonaws.com/#{@options[:bucket]}/"
67
67
  end
@@ -1,5 +1,5 @@
1
1
  module Anaconda
2
2
  module Rails
3
- VERSION = "0.0.3"
3
+ VERSION = "0.1.2"
4
4
  end
5
5
  end
@@ -0,0 +1,3 @@
1
+ To copy an Anaconda initializer to your Rails App, with some configuration values, just do:
2
+
3
+ rails generate anaconda:install
@@ -0,0 +1,12 @@
1
+ require 'rails/generators'
2
+
3
+ module Anaconda
4
+ class InstallGenerator < ::Rails::Generators::Base
5
+ desc "Copy Anaconda default files"
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def copy_config
9
+ template "config/initializers/anaconda.rb"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ require 'rails/generators'
2
+
3
+ module Anaconda
4
+ class MigrationGenerator < ::Rails::Generators::NamedBase
5
+ desc "Create a migration for the given class name"
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ argument :field_name, :type => :string, :default => "asset"
9
+
10
+ def create_migration_file
11
+ create_file "db/migrate/#{Time.now.strftime('%Y%m%d%H%M%S')}_anaconda_migration_for_#{file_name}.rb", <<-FILE
12
+ class AnacondaMigrationFor#{file_name.titlecase} < ActiveRecord::Migration
13
+ def change
14
+ add_column :#{plural_name}, :#{field_name}_filename, :string
15
+ add_column :#{plural_name}, :#{field_name}_file_path, :text
16
+ add_column :#{plural_name}, :#{field_name}_size, :integer
17
+ add_column :#{plural_name}, :#{field_name}_original_filename, :text
18
+ add_column :#{plural_name}, :#{field_name}_stored_privately, :boolean
19
+ add_column :#{plural_name}, :#{field_name}_type, :string
20
+ end
21
+ end
22
+ FILE
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,8 @@
1
+ # Use this setup block to configure all options available in Anaconda.
2
+ Anaconda.config do |config|
3
+ config.aws = {
4
+ aws_access_key: ENV["AWS_ACCESS_KEY"] || nil,
5
+ aws_secret_key: ENV["AWS_SECRET_KEY"] || nil,
6
+ aws_bucket: ENV["AWS_BUCKET"] || nil
7
+ }
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anaconda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben McFadden
@@ -60,9 +60,14 @@ files:
60
60
  - lib/anaconda/anaconda.rb
61
61
  - lib/anaconda/anaconda_for.rb
62
62
  - lib/anaconda/engine.rb
63
+ - lib/anaconda/form_builder_helpers.rb
63
64
  - lib/anaconda/railtie.rb
64
65
  - lib/anaconda/upload_helper.rb
65
66
  - lib/anaconda/version.rb
67
+ - lib/generators/anaconda/USAGE
68
+ - lib/generators/anaconda/install_generator.rb
69
+ - lib/generators/anaconda/migration_generator.rb
70
+ - lib/generators/anaconda/templates/config/initializers/anaconda.rb
66
71
  - test/helper.rb
67
72
  - test/test_anaconda.rb
68
73
  - vendor/assets/javascripts/.gitkeep