photofy 0.1.6 → 0.1.7

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/photofy.rb +132 -111
  3. metadata +6 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 49e3ec95765a73b90e67cce0cd7bdb93715e8a29
4
- data.tar.gz: dacaee79783ed98425ae22cf1cec3bf821f24d60
3
+ metadata.gz: 9d91dc5fee2f8769167a2bd1652afe389190d87e
4
+ data.tar.gz: 27a6f56405e6b5df8ad47d303eb01a3c03cf567d
5
5
  SHA512:
6
- metadata.gz: 05b9c2eb56e049b069f7fe5646fee1189baf554890daaeaadcbe2976a487430ba48089c8e7c9b01f8fd2e5ef8c5e261e671599b641e516b765f23c6674ca41e7
7
- data.tar.gz: dbfde9014503a0a2cd61a66531000a40121f2489ceee2fec4d66a2752fb86fb5d37e7bee55228373ae2d372490f9f32298b5a21a7353735e890fc98da37ac858
6
+ metadata.gz: f8d67b670200d45149d1d6e5d6ff13f1b0d5da5d2f1f20589914c53990ab9b78e976f871bbed7c182065910267ba9e0255565dfc325f67e7932d35d046473fbc
7
+ data.tar.gz: 61b15cac3e9c70458472f32c6a5001566f6d9d0ac7e76f294806f5354a97fa4840b742e1874fa7643e44f004c398520ec3422a7f804e161e63c928f3c7e935a1
@@ -1,154 +1,175 @@
1
- begin
2
- require "RMagick"
3
- rescue Exception => e
4
- puts "Unable to load 'RMagick' for after_photofy methods"
5
- end
6
-
7
1
  module Photofy
8
2
  def self.included(base)
9
3
  base.extend(ClassMethods)
10
4
  end
11
5
 
12
6
  module ClassMethods
13
- attr_accessor :photofield_flag
14
- attr_accessor :photofy_attr
15
- attr_accessor :photo_repository
16
-
17
- #Generates photo field from photo_field argument which can be used to store a post processed image(using rmagick) of originally uploaded.
18
- #Takes two arguments:
19
- #1. field name
20
- #2. Proc with rmagick img object
7
+ attr_accessor :photofied_flag
8
+ attr_accessor :photo_fields
9
+ attr_accessor :photos_repository
10
+ attr_accessor :photo_formats
11
+
12
+ #Getter to check if model is enabled with file_folder
13
+ def is_photofied?
14
+ @photofied_flag.nil? ? false : @photofied_flag
15
+ end
16
+
17
+ #Generates photo field which can be used to store a post processed image(using rmagick) of parent photo field.
18
+ #Takes three arguments:
19
+ #1. parent photo field name
20
+ #2. field name
21
+ #3. Proc with rmagick img object
21
22
  #return value should be an object of rmagick's image object
22
23
  #
23
24
  #Example usage..
24
- #after_photofy :stamp, Proc.new{|img| img.scale(25, 25)}
25
- #will give a 'stamp' attribute which on save of main photo filed will scale it to 25 x 25 dimesnions
26
- #after_photofy :portfolio, Proc.new{|img| img.scale(150, 250)}
27
- #will give a 'portfolio' attribute which on save of main photo filed will scale it to 150 x 250 dimesnions
28
- #and also provide 're_photofy_portfolio!'(Proc.new{|img| img.scale(10, 20)}) to perform operation on other user defined events
29
- def after_photofy(photo_field, p = Proc.new { |img| puts "Rmagick image: #{img.inspect}" })
30
- #define_method "#{photo_field}" do
31
- # File.exist?(send("#{photo_field}_path")) ? File.read(send("#{photo_field}_path")) : nil
32
- #end
33
-
34
- #define_method "#{photo_field}?" do
35
- # send("#{photo_field}").nil? ? false : true
36
- #end
37
-
38
- #define_method "#{photo_field}_cover_path" do
39
- # directoy_path = FileUtils.mkdir_p File.join(self.class.photo_repository, photo_field.to_s)
40
- # File.join(directoy_path, "#{photo_field}_#{self.send(self.class.primary_key)}.jpg")
41
- #end
42
-
43
- define_method "re_photofy_#{photo_field}!" do |proc|
44
- send("process_n_save_#{photo_field}", proc)
45
- end
46
-
47
- define_method "process_and_save_#{photo_field}!" do
48
- send("process_n_save_#{photo_field}", p)
49
- end
50
-
51
- define_method "process_n_save_#{photo_field}" do |proc|
52
- begin
53
- if File.exist?(send("#{photo_field}_path"))
54
- img = Magick::Image.read(send("#{photo_field}_path")).first # path of Orignal image that has to be worked upon
55
- img = proc.call(img)
56
- img.write(send("#{photo_field}_path"))
57
- end
58
- rescue Exception => e
59
- puts "Unable to process_n_save_#{photo_field} due to #{e.message}"
60
- e.backtrace.each { |trace| puts trace }
61
- end
62
- end
63
-
64
- define_method "destroy_#{photo_field}" do
65
- File.delete(send("#{photo_field}_path")) if File.exist?(send("#{photo_field}_path"))
66
- end
67
-
68
- send(:after_save, "process_and_save_#{photo_field}!")
69
- send(:after_destroy, "destroy_#{photo_field}")
70
- end
71
-
72
- #Getter to check if model is enabled with photofied
73
- def is_photofield?
74
- @photofield_flag.nil? ? false : @photofield_flag
75
- end
76
-
77
- def register_callbacks(photo_filed)
78
- send(:after_save, "#{photo_filed}_store!")
79
- send(:after_destroy, "#{photo_filed}_destroy!")
25
+ #after_photofy :profile, :stamp, Proc.new{|img| img.scale(25, 25)}
26
+ #will give a 'stamp' attribute which on save of 'profile' photo field will scale it to 25 x 25 dimensions
27
+ #after_photofy :profile, :portfolio, Proc.new{|img| img.scale(150, 250)}
28
+ #will give a 'portfolio' attribute which on save of 'profile' photo field will scale it to 150 x 250 dimensions
29
+ def after_photofy(parent_photo_field, photo_field, proc = Proc.new { |img| puts "Rmagick image: #{img.inspect}" })
30
+ photofy(photo_field, image_processor: proc, parent_photo_field: parent_photo_field)
80
31
  end
81
32
 
33
+ #Example
34
+ #photofy(:door)
35
+ #photofy(:small_door, {parent_photo_field: :door})
36
+ #photofy(:window, {image_processor: Proc.new { |img| img.scale(25, 25) }})
37
+ #after_photofy :door, :ventilator, Proc.new { |img| img.scale(25, 25) }
38
+ #
82
39
  #Generates photo filed from photo_field arguments and provides methods like
83
40
  #if photo_filed is "collage" then it provides methods on top of it as
84
41
  #collage >> Getter,
85
- #collage? >> Returns true if collage is having value other than nil else false,
86
- #collage = >> Setter. Accepted inputs are file upload(ActionDispatch::Http::UploadedFile), filer handle and String(format validation is ignored),
87
- #collage_path >> Getter of filepath,
42
+ #collage? >> Returns true if assignment is having value other than nil else false,
43
+ #collage = >> Setter. Acceptable inputs are file upload(ActionDispatch::Http::UploadedFile), filer handle and String(format validation is ignored),
44
+ #collage_path >> File path of assignment,
45
+ #collage_path_to_write >> File path of assignment to write (specific to writing. Used internally),
88
46
  #collage_persisted? >> true if provided file/data is stored on disk,
89
47
  #collage_store! >> to store provided file/data on disk,
90
48
  #collage_destroy! >> to store destroy stored file/data from disk
91
- def photofy(photo_filed, options = {})
92
- if options.is_a?(Hash)
93
- @photofy_attr ||={}
94
- @photofy_attr[photo_filed] ||={}
95
- @photofy_attr[photo_filed][:formats] = options[:formats].is_a?(Array) ? options[:formats].collect { |x| x.starts_with?(".") ? x : ".#{x}" } : [".bmp", ".jpg", ".jpeg", '.png']
96
- else
97
- raise "InvalidArguments"
49
+ #
50
+ #Options:
51
+ #image_processor: a proc for image processing like Proc.new { |img| img.scale(25, 25) }
52
+ #parent_photo_field: a parent photo field name to be used as source
53
+ def photofy(photo_field, options = {})
54
+ collect_photo_formats(photo_field, options)
55
+
56
+ @photo_fields ||=[]
57
+ @photo_fields << photo_field
58
+
59
+ define_method 'initialize_photo_buffers' do
60
+ @photo_file_buffer ||= {}
61
+ @photo_file_ofn ||= {}
98
62
  end
99
- register_callbacks(photo_filed)
100
63
 
101
- define_method "#{photo_filed}" do
102
- self.class.photofy_attr[photo_filed][:file_buffer].nil? ?
103
- (send("#{photo_filed}_persisted?") ? File.read(send("#{photo_filed}_path")) : nil)
104
- : self.class.photofy_attr[photo_filed][:file_buffer]
64
+ #Defining getter
65
+ define_method "#{photo_field}" do
66
+ send('initialize_photo_buffers')
67
+
68
+ if @photo_file_buffer[photo_field].nil?
69
+ send("#{photo_field}_persisted?") ? File.read(send("#{photo_field}_path")) : nil
70
+ else
71
+ @photo_file_buffer[photo_field]
72
+ end
105
73
  end
106
74
 
107
- define_method "#{photo_filed}?" do
108
- send("#{photo_filed}").nil? ? false : true
75
+ define_method "#{photo_field}?" do
76
+ send("#{photo_field}").nil? ? false : true
109
77
  end
110
78
 
111
- define_method "#{photo_filed}=" do |file_upload|
79
+ #Defining setter
80
+ define_method "#{photo_field}=" do |file_upload|
81
+ send('initialize_photo_buffers')
82
+
112
83
  if file_upload.class == ActionDispatch::Http::UploadedFile
113
- return false unless self.class.photofy_attr[photo_filed][:formats].include?(File.extname(file_upload.original_filename).downcase)
114
- self.class.photofy_attr[photo_filed][:file_buffer] = File.read(file_upload.path)
84
+ return false unless self.class.photo_formats[photo_field].include?(File.extname(file_upload.original_filename).downcase)
85
+ @photo_file_buffer[photo_field] = File.read(file_upload.path)
86
+ @photo_file_ofn[photo_field] = File.basename(file_upload.original_filename)
87
+
115
88
  elsif file_upload.class == File
116
- return false unless self.class.photofy_attr[photo_filed][:formats].include?(File.extname(file_upload.path).downcase)
117
- self.class.photofy_attr[photo_filed][:file_buffer] = file_upload.read
89
+ return false unless self.class.photo_formats[photo_field].include?(File.extname(file_upload.path).downcase)
90
+ @photo_file_buffer[photo_field] = file_upload.read
91
+ @photo_file_ofn[photo_field] = File.basename(file_upload.path)
92
+
93
+ file_upload.rewind
118
94
  elsif file_upload.class == String
119
- #return false unless self.class.photo_formats.include?(File.extname(file_upload).downcase)
120
- self.class.photofy_attr[photo_filed][:file_buffer] = file_upload
95
+ #return false unless self.class.photo_formats[photo_field].include?(File.extname(file_upload).downcase)
96
+ @photo_file_buffer[photo_field] = file_upload
97
+ #@photo_file_ofn[photo_field] = File.basename(file_upload.path) #As there is nothing like original_file_name for a string :)
121
98
  end
99
+
100
+ file_upload
101
+ end
102
+
103
+ define_method "#{photo_field}_path" do
104
+ directory_path = FileUtils.mkdir_p File.join(self.class.photos_repository, photo_field.to_s)
105
+ (guessed_file = Dir[File.join(directory_path, "#{self.send(self.class.primary_key).to_s}_*")].first).nil? ?
106
+ File.join(directory_path, self.send(self.class.primary_key).to_s) : guessed_file
122
107
  end
123
108
 
124
- define_method "#{photo_filed}_path" do
125
- directoy_path = FileUtils.mkdir_p File.join(self.class.photo_repository, photo_filed.to_s)
126
- File.join(directoy_path, self.send(self.class.primary_key).to_s)
109
+ define_method "#{photo_field}_path_to_write" do |overload_dir = nil|
110
+ directoy_path = FileUtils.mkdir_p File.join(self.class.photos_repository, photo_field.to_s, overload_dir.to_s)
111
+ File.join(directoy_path, "#{self.send(self.class.primary_key).to_s}#{(@photo_file_ofn[photo_field].nil?) ? "_" : "_#{@photo_file_ofn[photo_field]}" }")
127
112
  end
128
113
 
129
- define_method "#{photo_filed}_persisted?" do
130
- (self.class.photofy_attr[photo_filed][:file_buffer].nil? and File.file?(send("#{photo_filed}_path")))
114
+ define_method "#{photo_field}_persisted?" do
115
+ send('initialize_photo_buffers')
116
+ (@photo_file_buffer[photo_field].nil? and File.file?(send("#{photo_field}_path")))
131
117
  end
132
118
 
133
- define_method "#{photo_filed}_store!" do
134
- return unless self.class.is_photofield?
135
- unless self.class.photofy_attr[photo_filed][:file_buffer].nil?
136
- File.open(send("#{photo_filed}_path"), "wb+") { |f| f.puts(self.class.photofy_attr[photo_filed][:file_buffer]) }
137
- self.class.photofy_attr[photo_filed].delete(:file_buffer)
119
+ define_method "#{photo_field}_store" do |proc, parent_photo_field|
120
+ return unless self.class.is_photofied?
121
+
122
+ send('initialize_photo_buffers')
123
+
124
+ #Loading content from parent_photo_field if specified
125
+ send("#{photo_field}=", File.open(send("#{parent_photo_field}_path"))) unless parent_photo_field.nil?
126
+
127
+ unless @photo_file_buffer[photo_field].nil?
128
+ File.delete(send("#{photo_field}_path")) if File.exist?(send("#{photo_field}_path")) #Clearing any existing existence
129
+ File.open(send("#{photo_field}_path_to_write"), "wb+") { |f| f.puts(@photo_file_buffer[photo_field]) }
130
+
131
+ unless proc.nil?
132
+ FileUtils.copy(send("#{photo_field}_path_to_write"), send("#{photo_field}_path_to_write", "original_source"))
133
+ img = Magick::Image.read(send("#{photo_field}_path")).first
134
+ img = proc.call(img)
135
+ img.write(send("#{photo_field}_path_to_write"))
136
+ end
137
+
138
+ @photo_file_buffer[photo_field] = nil
139
+ @photo_file_ofn[photo_field] = nil
138
140
  end
139
141
  end
140
142
 
141
- define_method "#{photo_filed}_destroy!" do
142
- return unless self.class.is_photofield?
143
- self.class.photofy_attr[photo_filed].delete(:file_buffer)
144
- File.delete(send("#{photo_filed}_path")) if File.exist?(send("#{photo_filed}_path"))
143
+ define_method "#{photo_field}_store!" do
144
+ send("#{photo_field}_store", options[:image_processor], options[:parent_photo_field])
145
+ end
146
+
147
+ define_method "#{photo_field}_destroy!" do
148
+ return unless self.class.is_photofied?
149
+
150
+ send('initialize_photo_buffers')
151
+ @photo_file_buffer[photo_field] = nil
152
+ File.delete(send("#{photo_field}_path")) if File.exist?(send("#{photo_field}_path"))
145
153
  end
146
154
 
147
- @photofield_flag = true
155
+ send(:after_save, "#{photo_field}_store!")
156
+ send(:after_destroy, "#{photo_field}_destroy!")
157
+
158
+ @photofied_flag = true
159
+ end
160
+
161
+ def photos_repository
162
+ @photos_repository ||= FileUtils.mkdir_p File.join(Rails.root, "photofy", self.name)
148
163
  end
149
164
 
150
- def photo_repository
151
- @photo_repository ||= FileUtils.mkdir_p File.join(Rails.root, "photofied", self.name)
165
+ #Collects valid photo formats specific to photo fields
166
+ def collect_photo_formats(photo_field, options)
167
+ if options.is_a?(Hash)
168
+ @photo_formats ||= {}
169
+ @photo_formats[photo_field] = options[:formats].is_a?(Array) ? options[:formats].collect { |x| x.starts_with?(".") ? x : ".#{x}" } : [".jpeg", ".jpg", ".gif", ".png", ".bmp"]
170
+ else
171
+ raise 'InvalidArguments'
172
+ end
152
173
  end
153
174
 
154
175
  end
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: photofy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Praveen Kumar Sinha
8
8
  - Annu Yadav
9
- - sachin choudhary
9
+ - Sachin Choudhary
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
@@ -17,8 +17,10 @@ description: |-
17
17
  #Generates photo filed from photo_field arguments and provides methods like
18
18
  #if photo_filed is "collage" then it provides methods on top of it as
19
19
  #collage >> Getter,
20
- #collage = >> Setter. Accepted inputs are file upload(ActionDispatch::Http::UploadedFile), filer handle and String(no format validation is ignored),
21
- #collage_path >> Getter of filepath,
20
+ #collage? >> Returns true if assignment is having value other than nil else false,
21
+ #collage = >> Setter. Acceptable inputs are file upload(ActionDispatch::Http::UploadedFile), filer handle and String(format validation is ignored),
22
+ #collage_path >> File path of assignment,
23
+ #collage_path_to_write >> File path of assignment to write (specific to writing. Used internally),
22
24
  #collage_persisted? >> true if provided file/data is stored on disk,
23
25
  #collage_store! >> to store provided file/data on disk,
24
26
  #collage_destroy! >> to store destroy stored file/data from disk