activemodel-datastore 0.2.2 → 0.2.3

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: 798ea7d0389b4ebe382843a0392d3c1d2a9d2d9b
4
- data.tar.gz: ad21cf50902c04a3277eab704e5a0b9c81bb8db5
3
+ metadata.gz: 43c4bfc5e295411cd88d6bdff0897e564dea9e23
4
+ data.tar.gz: 4ed3b3a28213026e2c99cb0f616372c82958d78f
5
5
  SHA512:
6
- metadata.gz: d2323ec3937aca9cf5bd817f7788d0990fe4ba965ff0b03c5421cd0c662e5308a6caaab4daf5965d5c8b719d7117dc34fd9ab6bf27b8d1cb61d007fe02adfa52
7
- data.tar.gz: 2d3660d111a2fbbb3081861b4657a016d0decd16ba966a1e55212f20653f2914a2cb9a671f298a5e9acd469138cfe063f8c7362c08a103452adaf95ae1d61752
6
+ metadata.gz: ebe8bb990217d55648209e66be3114176d83e85c81fdecf3f4b1396346f1b063cb823e8aed2e7599e9568e1bd0c92bb4e5ae0dd7c2801a8114eeaf6513e41fb1
7
+ data.tar.gz: 6b623ad9ccc3094e96b19969df904e844c4659f9b7dbbabebfd97ae6c8e98311c437c9b3ee4cbdaa2b6733ff2ceb085b0d242baf0be8e5a67802dea83d5043dd
@@ -1,3 +1,8 @@
1
+ ### 0.2.3 / 2017-05-24
2
+ * adding CarrierWave file upload support
3
+ * updating example Cloud Datastore Rails app to 5.1
4
+ * adding image upload example to example Rails app
5
+
1
6
  ### 0.2.2 / 2017-04-27
2
7
 
3
8
  * now store a hash of entity properties during entity to model conversion
data/README.md CHANGED
@@ -24,6 +24,7 @@ suited for unstructured or semi-structured application data.
24
24
  - [Datastore Indexes](#indexes)
25
25
  - [Datastore Emulator](#emulator)
26
26
  - [Example Rails App](#rails)
27
+ - [CarrierWave File Uploads](#carrierwave)
27
28
  - [Track Changes](#track_changes)
28
29
  - [Nested Forms](#nested)
29
30
  - [Datastore Gotchas](#gotchas)
@@ -471,6 +472,47 @@ There is an example Rails 5 app in the test directory [here](https://github.com/
471
472
  ```
472
473
 
473
474
  Navigate to http://localhost:3000.
475
+
476
+ ## <a name="carrierwave"></a>CarrierWave File Uploads
477
+
478
+ Active Model Datastore has built in support for [CarrierWave](https://github.com/carrierwaveuploader/carrierwave)
479
+ which is a simple and extremely flexible way to upload files from Rails applications. You can use
480
+ different stores, including filesystem and cloud storage such as Google Cloud Storage or AWS.
481
+
482
+ Simply require `active_model/datastore/carrier_wave_uploader` and extend your model with the
483
+ CarrierWaveUploader (after including ActiveModel::Datastore). Follow the CarrierWave
484
+ [instructions](https://github.com/carrierwaveuploader/carrierwave#getting-started) for generating
485
+ an uploader.
486
+
487
+ In this example it will be something like:
488
+
489
+ `rails generate uploader ProfileImage`
490
+
491
+ Define an attribute on the model for your file(s). You can then mount the uploaders using
492
+ `mount_uploader` (single file) or `mount_uploaders` (array of files). Don't forget to add the new
493
+ attribute to `entity_properties` and whitelist the attribute in the controller if using strong
494
+ parameters.
495
+
496
+ ```ruby
497
+ require 'active_model/datastore/carrier_wave_uploader'
498
+
499
+ class User
500
+ include ActiveModel::Datastore
501
+ extend CarrierWaveUploader
502
+
503
+ attr_accessor :email, :enabled, :name, :profile_image, :role
504
+
505
+ mount_uploader :profile_image, ProfileImageUploader
506
+
507
+ def entity_properties
508
+ %w[email enabled name profile_image role]
509
+ end
510
+ end
511
+ ```
512
+
513
+ You will want to add something like this to your Rails form:
514
+
515
+ `<%= form.file_field :profile_image %>`
474
516
 
475
517
  ## <a name="track_changes"></a>Track Changes
476
518
 
@@ -0,0 +1,117 @@
1
+ module CarrierWaveUploader
2
+ include CarrierWave::Mount
3
+
4
+ private
5
+
6
+ def mount_base(column, uploader = nil, options = {}, &block)
7
+ super
8
+
9
+ # include CarrierWave::Validations::ActiveModel
10
+ #
11
+ # validates_integrity_of column if uploader_option(column.to_sym, :validate_integrity)
12
+ # validates_processing_of column if uploader_option(column.to_sym, :validate_processing)
13
+ # validates_download_of column if uploader_option(column.to_sym, :validate_download)
14
+
15
+ after_save :"store_#{column}!"
16
+ after_update :"store_#{column}!"
17
+ after_destroy :"remove_#{column}!"
18
+
19
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
20
+ ##
21
+ # Override for setting the file urls on the entity.
22
+ #
23
+ def build_entity(parent = nil)
24
+ entity = super(parent)
25
+ self.class.uploaders.keys.each do |col|
26
+ entity[col.to_s] = send("get_" + col.to_s + "_identifiers")
27
+ end
28
+ entity
29
+ end
30
+
31
+ ##
32
+ # Override to append file names for mount_uploaders.
33
+ # Works with multiple files stored as an Array.
34
+ #
35
+ def update(params)
36
+ existing_files = {}
37
+ self.class.uploaders.keys.each do |attr_name|
38
+ existing_files[attr_name] = uploader_file_names(attr_name) if send(attr_name).is_a? Array
39
+ end
40
+ assign_attributes(params)
41
+ return unless valid?
42
+ run_callbacks :update do
43
+ entity = build_entity
44
+ self.class.uploaders.keys.each do |attr_name|
45
+ entity[attr_name] = append_files(entity[attr_name], existing_files[attr_name])
46
+ end
47
+ self.class.retry_on_exception? { CloudDatastore.dataset.save entity }
48
+ end
49
+ end
50
+
51
+ ##
52
+ # For new entities, set the identifiers (file names).
53
+ # For deleted entities, set the identifier (which will be nil).
54
+ # For updated entities, set the identifiers if they have changed. The
55
+ # identifier will be nil if files were not uploaded during the update.
56
+ #
57
+ def get_#{column}_identifiers
58
+ identifier = write_#{column}_identifier
59
+ if persisted? && !remove_#{column}? && identifier.nil?
60
+ if defined?(#{column}_identifier) && #{column}_identifier.present?
61
+ #{column}_identifier if defined?(#{column}_identifier) && #{column}_identifier.present?
62
+ elsif defined?(#{column}_identifiers) && #{column}_identifiers.present?
63
+ #{column}_identifiers
64
+ end
65
+ else
66
+ identifier
67
+ end
68
+ end
69
+
70
+ ##
71
+ # Called by CarrierWave::Mount.mount_uploaders -> write_#{column}_identifier.
72
+ #
73
+ def write_uploader(column, identifier)
74
+ identifier
75
+ end
76
+
77
+ ##
78
+ # This gets called whenever the uploaders instance variable is nil.
79
+ # It returns the uploader identifiers (file names) for the desired column.
80
+ #
81
+ def read_uploader(column)
82
+ if entity_property_values.present? && entity_property_values.key?(column.to_s)
83
+ entity_property_values[column.to_s]
84
+ end
85
+ end
86
+
87
+ ##
88
+ # Reset cached mounter on record reload.
89
+ #
90
+ def reload!
91
+ @_mounters = nil
92
+ super
93
+ end
94
+
95
+ ##
96
+ # Reset cached mounter on record dup.
97
+ #
98
+ def initialize_dup(other)
99
+ @_mounters = nil
100
+ super
101
+ end
102
+
103
+ # private
104
+
105
+ def uploader_file_names(attr_name)
106
+ send(attr_name).map { |x| x.file.filename }
107
+ end
108
+
109
+ def append_files(files, new_files)
110
+ if files.is_a?(Array) && !new_files.nil?
111
+ files = files.push(*new_files).flatten.compact.uniq
112
+ end
113
+ files
114
+ end
115
+ RUBY
116
+ end
117
+ end
@@ -1,5 +1,5 @@
1
1
  module ActiveModel
2
2
  module Datastore
3
- VERSION = '0.2.2'
3
+ VERSION = '0.2.3'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemodel-datastore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryce McLean
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-27 00:00:00.000000000 Z
11
+ date: 2017-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -154,14 +154,28 @@ dependencies:
154
154
  requirements:
155
155
  - - "~>"
156
156
  - !ruby/object:Gem::Version
157
- version: 0.48.0
157
+ version: '0.48'
158
158
  type: :development
159
159
  prerelease: false
160
160
  version_requirements: !ruby/object:Gem::Requirement
161
161
  requirements:
162
162
  - - "~>"
163
163
  - !ruby/object:Gem::Version
164
- version: 0.48.0
164
+ version: '0.48'
165
+ - !ruby/object:Gem::Dependency
166
+ name: carrierwave
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '1.1'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - "~>"
177
+ - !ruby/object:Gem::Version
178
+ version: '1.1'
165
179
  description: Makes the google-cloud-datastore gem compliant with active_model conventions
166
180
  and compatible with your Rails 5+ applications.
167
181
  email:
@@ -174,6 +188,7 @@ files:
174
188
  - LICENSE.txt
175
189
  - README.md
176
190
  - lib/active_model/datastore.rb
191
+ - lib/active_model/datastore/carrier_wave_uploader.rb
177
192
  - lib/active_model/datastore/connection.rb
178
193
  - lib/active_model/datastore/errors.rb
179
194
  - lib/active_model/datastore/nested_attr.rb
@@ -201,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
216
  version: '0'
202
217
  requirements: []
203
218
  rubyforge_project:
204
- rubygems_version: 2.6.10
219
+ rubygems_version: 2.6.11
205
220
  signing_key:
206
221
  specification_version: 4
207
222
  summary: Cloud Datastore integration with Active Model