8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
|
# File 'lib/gcloud_storage/uploader.rb', line 8
def mount_gcloud_uploader(column, options = {})
private_methods = []
attr_accessor :"#{column}_uploader_object"
after_save :"upload_#{column}_file_to_gc", if: lambda { send(:"saved_change_to_#{column}?") }
before_destroy :"delete_#{column}_file_from_gc"
after_initialize :"init_file_name_for_#{column}", if: lambda { send(:"#{column}_uploader_object").present? }
if options[:presence] == true
validate :"#{column}_presence"
define_method(:"#{column}_presence") do
errors.add(column,"cannot be empty. Please set a file path for :#{column}_uploader_object attribute.") unless send(column.to_sym).present?
end
private_methods << :"#{column}_presence"
end
define_method(:"#{column}_path") do
"uploads/#{self.class.to_s.underscore}s/#{self.id || "non_persisted"}/#{column}s/#{send(column.to_sym)}"
end
define_method(:"#{column}_url") do
expirable_gc_url(send(:"#{column}_path"))
end
define_method(:"#{column}_exists?") do
send("#{column}_url".to_sym).present?
end
define_method(:"#{column}_expirable_url") do |num_secs|
expirable_gc_url(send(:"#{column}_path"), num_secs)
end
define_method(:"upload_#{column}_file_to_gc") do
upload_file_to_gc(send(:"#{column}_uploader_object"), send(:"#{column}_path")) if send(:"#{column}_uploader_object").present?
end
define_method(:"delete_#{column}_file_from_gc") do
delete_file_from_gc(send(:"#{column}_path")) if send(column.to_sym).present?
end
define_method(:"init_file_name_for_#{column}") do
send(:"#{column}=", sanitize_filename(return_filename(send(:"#{column}_uploader_object"))))
end
private_methods.push(
:"upload_#{column}_file_to_gc",
:"delete_#{column}_file_from_gc",
:"init_file_name_for_#{column}"
)
unless respond_to?(:sanitize_filename)
define_method(:sanitize_filename) do |file_name|
file_name.gsub(/[^0-9A-z.\-]/, '_') if file_name
end
private_methods << :sanitize_filename
end
unless respond_to?(:return_filename)
define_method(:return_filename) do |file|
if file.is_a?(String)
file.split("/").last
elsif file.is_a?(Pathname)
file.to_s
elsif file.respond_to?(:original_filename)
file.original_filename
end
end
private_methods << :return_filename
end
unless respond_to?(:upload_file_to_gc)
define_method(:upload_file_to_gc) do |file_path, dest_path|
GcloudStorage.service.upload_file(file_path, dest_path)
end
private_methods << :upload_file_to_gc
end
unless respond_to?(:delete_file_from_gc)
define_method(:delete_file_from_gc) do |file_path|
GcloudStorage.service.delete_file(file_path)
end
private_methods << :delete_file_from_gc
end
unless respond_to?(:expirable_gc_url)
define_method(:expirable_gc_url) do |file_path, num_secs = 300|
GcloudStorage.service.expirable_url(file_path, num_secs) if persisted?
end
private_methods << :expirable_gc_url
end
private_methods.each {|method| private method}
end
|