attachment-san 0.0.1 → 0.0.2

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.
data/TODO CHANGED
@@ -1,6 +1,3 @@
1
- * Make it actually work with more than one attachment class.
2
- * has_attachment :watermark, :superclass => WatermarkSuperclass
3
- * has_attachment :watermark, :class => WatermarkClass
4
- * Nest created classes under the superclass.
1
+ * Allow the user to override any of the attachment_san_options on the dynamically created attachment subclasses.
5
2
  * Do we need to sanitize the original filename, eg lowercase.
6
3
  * Make :filename_scheme => :record_identifier also use nesting under parent resources. Eg /resources/1/images/2/filename
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{attachment-san}
8
- s.version = "0.0.1"
8
+ s.version = "0.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Eloy Duran", "Manfred Stienstra"]
12
- s.date = %q{2009-11-19}
12
+ s.date = %q{2009-12-01}
13
13
  s.description = %q{Rails plugin for easy and rich attachment manipulation.}
14
14
  s.email = ["eloy@fngtps.com", "manfred@fngtps.com"]
15
15
  s.extra_rdoc_files = [
@@ -22,10 +22,12 @@ Gem::Specification.new do |s|
22
22
  "Rakefile",
23
23
  "TODO",
24
24
  "VERSION",
25
+ "attachment-san.gemspec",
25
26
  "examples/photo.rb",
26
27
  "examples/photos_controller.rb",
27
28
  "examples/post.rb",
28
29
  "lib/attachment_san.rb",
30
+ "lib/attachment_san/core_ext.rb",
29
31
  "lib/attachment_san/has.rb",
30
32
  "lib/attachment_san/test/helper.rb",
31
33
  "lib/attachment_san/test/rails.png",
@@ -33,6 +35,7 @@ Gem::Specification.new do |s|
33
35
  "napkin.rb",
34
36
  "rails/init.rb",
35
37
  "test/attachment_san_test.rb",
38
+ "test/core_ext_test.rb",
36
39
  "test/fixtures/models/attachment.rb",
37
40
  "test/fixtures/models/document.rb",
38
41
  "test/fixtures/models/options_stub.rb",
@@ -48,6 +51,7 @@ Gem::Specification.new do |s|
48
51
  s.summary = %q{Rails plugin for easy and rich attachment manipulation.}
49
52
  s.test_files = [
50
53
  "test/attachment_san_test.rb",
54
+ "test/core_ext_test.rb",
51
55
  "test/fixtures/models/attachment.rb",
52
56
  "test/fixtures/models/document.rb",
53
57
  "test/fixtures/models/options_stub.rb",
@@ -1,3 +1,4 @@
1
+ require "attachment_san/core_ext"
1
2
  require "attachment_san/has"
2
3
  require "attachment_san/variant"
3
4
 
@@ -35,7 +36,7 @@ module AttachmentSan
35
36
 
36
37
  @uploaded_file = uploaded_file
37
38
  self.filename = uploaded_file.original_filename
38
- self.content_type = uploaded_file.content_type
39
+ self.content_type = uploaded_file.content_type.strip
39
40
 
40
41
  callback :after_upload
41
42
  end
@@ -0,0 +1,32 @@
1
+ module AttachmentSan
2
+ module ModuleExt
3
+ # Retrieve a Module/Class bfor the given +name+. It differentiates from
4
+ # +const_get+ in that it _only_ searches in the mod it’s called on.
5
+ #
6
+ # class A
7
+ # class B
8
+ # end
9
+ # end
10
+ #
11
+ # class C; end
12
+ #
13
+ # # If the requested mod exists in the namespace, the result is the same:
14
+ # A.const_get('B') # => A::B
15
+ # A.modulized_mod_get('B') # => A::B
16
+ #
17
+ # # Now notice that const_get finds the mod outside the `A' namespace:
18
+ # A.const_get('C') # => C
19
+ # A.modulized_mod_get('C') # => NameError
20
+ def modulized_mod_get(name)
21
+ const = const_get(name)
22
+ modulized_name = "#{self.name}::#{name}"
23
+
24
+ if const.is_a?(Module) && const.name == modulized_name
25
+ const
26
+ else
27
+ raise NameError, "uninitialized mod constant #{modulized_name}"
28
+ end
29
+ end
30
+ end
31
+ Module.send(:include, ModuleExt)
32
+ end
@@ -1,6 +1,7 @@
1
1
  module AttachmentSan
2
2
  module Has
3
- VALID_OPTIONS = [:name, :process, :class, :variants, :filename_scheme]
3
+ MODEL_OPTIONS = [:base_path, :public_base_path, :extension, :filename_scheme]
4
+ VARIANT_OPTIONS = [:name, :process, :class, :variants, :filename_scheme]
4
5
 
5
6
  def has_attachment(name, options = {})
6
7
  define_attachment_association :has_one, name, options
@@ -13,37 +14,43 @@ module AttachmentSan
13
14
  private
14
15
 
15
16
  def define_attachment_association(macro, name, options)
16
- define_variants(name, extract_variant_options!(options))
17
- send(macro, name, options) unless reflect_on_association(name)
17
+ model_options = extract_options!(options, MODEL_OPTIONS)
18
+ model = create_model(name, model_options)
19
+
20
+ variant_options = extract_options!(options, VARIANT_OPTIONS)
21
+ define_variants(model, variant_options)
22
+
23
+ send(macro, name, options.merge(:class_name => model.name)) unless reflect_on_association(name)
18
24
  end
19
25
 
20
- def extract_variant_options!(options)
26
+ def extract_options!(options, keys)
21
27
  options.symbolize_keys!
22
- variant_options = options.slice(*VALID_OPTIONS)
23
- options.except!(*VALID_OPTIONS)
24
- variant_options
28
+ extracted_options = options.slice(*keys)
29
+ options.except!(*keys)
30
+ extracted_options
25
31
  end
26
32
 
27
- def define_variants(name, options)
28
- model = create_model(name)
29
-
30
- original = { :class => Variant::Original }
31
- original.merge!(options) unless options.has_key?(:variants)
33
+ def define_variants(model, options)
34
+ original = options[:variants] ? (options[:variants][:original] || {}) : options
35
+ original[:class] ||= Variant::Original if original.is_a?(Hash)
32
36
  model.send(:define_variant, :original, original)
33
37
 
34
38
  if variants = options[:variants]
35
- variants.each do |name, options|
36
- model.send(:define_variant, name, options)
39
+ variants.each do |name, variant_options|
40
+ model.send(:define_variant, name, variant_options)
37
41
  end
38
42
  end
43
+
44
+ model
39
45
  end
40
46
 
41
- # TODO: Currently creates these classes in the top level namespace
42
- def create_model(name)
47
+ def create_model(name, options)
43
48
  name = name.to_s.classify
44
- ::Object.const_get(name)
49
+ modulized_mod_get(name)
45
50
  rescue NameError
46
- ::Object.const_set name, Class.new(AttachmentSan.attachment_class)
51
+ model = const_set(name, Class.new(AttachmentSan.attachment_class))
52
+ model.attachment_san_options.merge!(options)
53
+ model
47
54
  end
48
55
  end
49
56
  end
@@ -27,7 +27,7 @@ module AttachmentSan
27
27
  when Proc
28
28
  { :class => Variant, :process => x }
29
29
  when nil
30
- { :class => const_get(name.to_s.camelize) }
30
+ { :class => modulized_mod_get(name.to_s.camelize) }
31
31
  else
32
32
  raise TypeError, "Please specify a options hash, variant class, or process proc. Can't use `#{x.inspect}'."
33
33
  end
@@ -65,11 +65,11 @@ module AttachmentSan
65
65
  end
66
66
 
67
67
  def base_path
68
- base_options[:base_path]
68
+ @reflection[:base_path] || base_options[:base_path]
69
69
  end
70
70
 
71
71
  def public_base_path
72
- base_options[:public_base_path]
72
+ @reflection[:public_base_path] || base_options[:public_base_path]
73
73
  end
74
74
 
75
75
  def filename_scheme
@@ -92,6 +92,11 @@ module AttachmentSan
92
92
  @record.token.scan(/.{2}/)
93
93
  end
94
94
 
95
+ # Returns the original filename, without extension, and appends the variant name.
96
+ def filename_with_variant_name
97
+ "#{@record.filename_without_extension}.#{name}"
98
+ end
99
+
95
100
  def filename
96
101
  unless @filename
97
102
  @filename =
@@ -99,12 +104,13 @@ module AttachmentSan
99
104
  when :variant_name
100
105
  name.to_s
101
106
  when :keep_original
102
- @record.filename
107
+ filename_with_variant_name
103
108
  when :record_identifier
104
- @record_class_name ||= @record.class.name.underscore.pluralize
109
+ # For now we take only the demodulized attachment class name.
110
+ @record_class_name ||= @record.class.name.demodulize.underscore.pluralize
105
111
  "/#{@record_class_name}/#{@record.to_param}/#{name}"
106
112
  when :token
107
- File.join(token, "#{@record.filename_without_extension}.#{name}")
113
+ File.join(token, filename_with_variant_name)
108
114
  else
109
115
  raise ArgumentError, "The :filename_scheme option should be one of `:token', `:filename_scheme', `:record_identifier', or `:variant_name', it currently is `#{filename_scheme.inspect}'."
110
116
  end
@@ -140,7 +146,15 @@ module AttachmentSan
140
146
  end
141
147
 
142
148
  def filename
143
- @filename ||= (filename_scheme == :token ? File.join(token, @record.filename) : super)
149
+ @filename ||=
150
+ case filename_scheme
151
+ when :token
152
+ File.join(token, @record.filename)
153
+ when :keep_original
154
+ @record.filename
155
+ else
156
+ super
157
+ end
144
158
  end
145
159
 
146
160
  def process!
@@ -1,4 +1,5 @@
1
1
  require 'attachment_san'
2
2
  ActiveRecord::Base.extend AttachmentSan::Initializer
3
+ ActiveRecord::Base.extend AttachmentSan::Has
3
4
 
4
5
  require 'attachment_san/test/helper' if Rails.env == 'test'
@@ -76,8 +76,8 @@ describe "AttachmentSan, class methods" do
76
76
  end
77
77
 
78
78
  it "should define a variant with options" do
79
- Logo.variant_reflections.map { |r| r[:name] }.should == [:original, :header]
80
- Logo.new.header.should.be.instance_of MyVariant
79
+ Document::Logo.variant_reflections.map { |r| r[:name] }.should == [:original, :header]
80
+ Document::Logo.new.header.should.be.instance_of MyVariant
81
81
  end
82
82
  end
83
83
 
@@ -95,8 +95,10 @@ describe "AttachmentSan, instance methods" do
95
95
  @attachment.filename.should == @upload.original_filename
96
96
  end
97
97
 
98
- it "should assign the content type to the model" do
99
- @attachment.content_type.should == @upload.content_type
98
+ it "should strip the content type and assign to the model" do
99
+ @upload.stubs(:content_type).returns("\simage/png\r\n")
100
+ @attachment = Attachment.new(:uploaded_file => @upload)
101
+ @attachment.content_type.should == 'image/png'
100
102
  end
101
103
 
102
104
  it "should return the original file's extension" do
@@ -0,0 +1,17 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ module CoreExtSpecs
4
+ class Foo
5
+ class Bar; end
6
+ end
7
+
8
+ class Baz; end
9
+ end
10
+
11
+ describe "Module" do
12
+ it "should try to retrieve a constant by the full modulized name of the mod it’s called on" do
13
+ # ActiveSupport::Dependencies raises an ArgumentError instead of NameError... :(
14
+ lambda { CoreExtSpecs::Foo.modulized_mod_get('Baz') }.should.raise ArgumentError
15
+ CoreExtSpecs::Foo.modulized_mod_get('Bar').should.be CoreExtSpecs::Foo::Bar
16
+ end
17
+ end
@@ -1,39 +1,35 @@
1
1
  class MyVariant < AttachmentSan::Variant
2
- def process!
3
- end
2
+ def process!; end
4
3
  end
5
4
 
6
- class MyProcessor
7
- def initialize(variant)
8
- end
5
+ class MyOtherVariant < AttachmentSan::Variant
6
+ def process!; end
9
7
  end
10
8
 
11
- class AddressCard < Attachment
12
- class SmallCard < AttachmentSan::Variant
13
- def process!
14
- puts 'SMALL!'
15
- end
16
- end
17
-
18
- class BigCard < AttachmentSan::Variant
19
- def process!
20
- puts 'BIG!'
21
- end
22
- end
9
+ class MyOriginal < AttachmentSan::Variant::Original
10
+ end
11
+
12
+ class MyProcessor
13
+ def initialize(variant); end
23
14
  end
24
15
 
25
16
  class Document < ActiveRecord::Base
26
- extend AttachmentSan::Has
27
-
28
17
  has_attachment :watermark
29
18
  has_attachment :logo, :variants => { :header => MyVariant }
30
19
 
31
- has_attachments :misc_files, :filename_scheme => :keep_original, :process => proc { :from_process_proc }
20
+ has_attachments :misc_files, :class => MyOriginal, :filename_scheme => :keep_original, :process => proc { :from_process_proc }
32
21
  has_attachments :images, :variants => {
33
22
  :thumbnail => proc { |v| MyProcessor.new(v) },
34
23
  :medium_sized => proc {},
35
24
  :download => proc {}
36
25
  }
26
+ end
27
+
28
+ class OtherDocument < ActiveRecord::Base
29
+ has_attachment :logo, :variants => { :header => MyOtherVariant }
30
+ has_attachments :misc_files, :filename_scheme => :keep_original, :process => proc { :from_other_process_proc }
37
31
 
38
- has_attachments :address_cards, :variants => [:small_card, :big_card]
32
+ has_attachments :images, :base_path => '/other/base', :public_base_path => '/other/public', :variants => {
33
+ :normal => { :base_path => '/yet/another/base', :process => proc {} }
34
+ }
39
35
  end
@@ -1,34 +1,71 @@
1
1
  require File.expand_path('../test_helper', __FILE__)
2
2
 
3
3
  describe "AttachmentSan::Has" do
4
+ process_proc = proc {}
5
+
4
6
  it "should pass on any unknown options to the has_one macro" do
5
- Document.expects(:has_one).with(:other_file, :as => :attachable, :order => :updated_at)
6
- Document.expects(:define_variants).with(:other_file, :process => proc {}, :class => MyVariant, :filename_scheme => :token, :variants => [:hoge, :fuga])
7
+ Document.expects(:has_one).with(:other_file, :as => :attachable, :order => :updated_at, :class_name => 'Document::OtherFile')
8
+ Document.expects(:define_variants).with do |model, options|
9
+ model == Document::OtherFile && options == { :process => process_proc, :class => MyVariant }
10
+ end
7
11
 
8
12
  Document.has_attachment :other_file, :as => :attachable, :order => :updated_at,
9
- :process => proc {}, :class => MyVariant, :filename_scheme => :token, :variants => [:hoge, :fuga]
13
+ :process => process_proc, :class => MyVariant, :filename_scheme => :token
10
14
  end
11
15
 
12
16
  it "should pass on any unknown options to the has_many macro" do
13
- Document.expects(:has_many).with(:other_files, :as => :attachable, :order => :updated_at)
14
- Document.expects(:define_variants).with(:other_files, :process => proc {}, :class => MyVariant, :filename_scheme => :token, :variants => [:hoge, :fuga])
17
+ Document.expects(:has_many).with(:other_files, :as => :attachable, :order => :updated_at, :class_name => 'Document::OtherFile')
18
+ Document.expects(:define_variants).with do |model, options|
19
+ model == Document::OtherFile && options == { :process => process_proc, :class => MyVariant }
20
+ end
15
21
 
16
22
  Document.has_attachments :other_files, :as => :attachable, :order => :updated_at,
17
- :process => proc {}, :class => MyVariant, :filename_scheme => :token, :variants => [:hoge, :fuga]
23
+ :process => process_proc, :class => MyVariant, :filename_scheme => :token
18
24
  end
19
25
 
20
26
  it "should not define an association if an association for the given name exists" do
21
27
  Document.expects(:has_one).never
22
- Document.expects(:define_variants).with(:watermark, {})
28
+ Document.expects(:define_variants).with do |model, options|
29
+ model == Document::Watermark && options == {}
30
+ end
23
31
 
24
32
  Document.expects(:has_many).never
25
- Document.expects(:define_variants).with(:images, {})
33
+ Document.expects(:define_variants).with do |model, options|
34
+ model == Document::Image && options == {}
35
+ end
26
36
 
27
37
  Document.has_attachment :watermark, :as => :attachable
28
38
  Document.has_attachments :images, :as => :attachable
29
39
  end
30
40
  end
31
41
 
42
+ describe "AttachmentSan::Has, concerning defining attachment model subclasses" do
43
+ it "should create an attachment model class when defining a single attachment association" do
44
+ Document.reflect_on_association(:logo).klass.should.be Document::Logo
45
+ Document::Logo.superclass.should.be AttachmentSan.attachment_class
46
+ end
47
+
48
+ it "should create an attachment model class when defining a collection attachment association" do
49
+ Document.reflect_on_association(:images).klass.should.be Document::Image
50
+ Document::Image.superclass.should.be AttachmentSan.attachment_class
51
+ end
52
+
53
+ it "should create different attachment model classes for different defining model classes" do
54
+ Document::Logo.reflect_on_variant(:header)[:class].should.be MyVariant
55
+
56
+ OtherDocument.reflect_on_association(:logo).klass.should.be OtherDocument::Logo
57
+ OtherDocument::Logo.reflect_on_variant(:header)[:class].should.be MyOtherVariant
58
+ end
59
+
60
+ it "should not look for existing constants outside the defining class's namespace" do
61
+ class TotallyDifferent; end
62
+ class Foo < TotallyDifferent; end
63
+
64
+ Document.has_attachment :foo
65
+ Document.reflect_on_association(:foo).klass.should.be Document::Foo
66
+ end
67
+ end
68
+
32
69
  describe "AttachmentSan::Has, concerning a single associated attachment" do
33
70
  before do
34
71
  @document = Document.new
@@ -36,21 +73,18 @@ describe "AttachmentSan::Has, concerning a single associated attachment" do
36
73
  @document.build_watermark :uploaded_file => rails_icon
37
74
  end
38
75
 
39
- it "should create a model class and a has_one association" do
40
- reflection = Document.reflect_on_association(:logo)
41
- reflection.macro.should == :has_one
42
- reflection.klass.should == Logo
43
- Logo.superclass.should.be AttachmentSan.attachment_class
76
+ it "should define a has_one association" do
77
+ Document.reflect_on_association(:logo).macro.should == :has_one
44
78
  end
45
79
 
46
80
  it "should store the variant options on the new model class" do
47
- Watermark.variant_reflections.length.should == 1
48
- Watermark.variant_reflections.first[:name].should == :original
49
- Watermark.variant_reflections.first[:class].should == AttachmentSan::Variant::Original
81
+ Document::Watermark.variant_reflections.length.should == 1
82
+ Document::Watermark.variant_reflections.first[:name].should == :original
83
+ Document::Watermark.variant_reflections.first[:class].should == AttachmentSan::Variant::Original
50
84
 
51
- Logo.variant_reflections.length.should == 2
52
- Logo.variant_reflections.last[:name].should == :header
53
- Logo.variant_reflections.last[:class].should == MyVariant
85
+ Document::Logo.variant_reflections.length.should == 2
86
+ Document::Logo.variant_reflections.last[:name].should == :header
87
+ Document::Logo.variant_reflections.last[:class].should == MyVariant
54
88
  end
55
89
 
56
90
  it "should define only a default original variant if no other variants are given" do
@@ -63,7 +97,7 @@ describe "AttachmentSan::Has, concerning a single associated attachment" do
63
97
  %w{ original header }.each do |name|
64
98
  variant = @document.logo.send(name)
65
99
  variant.name.to_s.should == name
66
- variant.should.be.instance_of Logo.reflect_on_variant(name)[:class]
100
+ variant.should.be.instance_of Document::Logo.reflect_on_variant(name)[:class]
67
101
  end
68
102
  end
69
103
  end
@@ -75,10 +109,8 @@ describe "AttachmentSan::Has, concerning a collection of associated attachments"
75
109
  2.times { @document.misc_files.build :uploaded_file => rails_icon }
76
110
  end
77
111
 
78
- it "should create a model class and a has_many association" do
79
- reflection = Document.reflect_on_association(:images)
80
- reflection.macro.should == :has_many
81
- reflection.klass.should == Image
112
+ it "should define a has_many association" do
113
+ Document.reflect_on_association(:images).macro.should == :has_many
82
114
  end
83
115
 
84
116
  it "should define only a default original variant if no others are given" do
@@ -98,19 +130,17 @@ end
98
130
 
99
131
  describe "AttachmentSan::Has, concerning attachment definitions with only a default original variant" do
100
132
  it "should pass the options hash on to the variant" do
101
- MiscFile.variant_reflections.length.should == 1
102
- MiscFile.variant_reflections.first[:name].should == :original
103
- MiscFile.variant_reflections.first[:class].should == AttachmentSan::Variant::Original
104
- MiscFile.variant_reflections.first[:filename_scheme].should == :keep_original
105
- MiscFile.variant_reflections.first[:process].call.should == :from_process_proc
133
+ Document::MiscFile.variant_reflections.length.should == 1
134
+ Document::MiscFile.variant_reflections.first[:name].should == :original
135
+ Document::MiscFile.variant_reflections.first[:class].should == MyOriginal
136
+ # Document::MiscFile.variant_reflections.first[:filename_scheme].should == :keep_original
137
+ Document::MiscFile.variant_reflections.first[:process].call.should == :from_process_proc
106
138
  end
107
139
  end
108
140
 
109
- describe "AttachmentSan::Has, concerning attachment definitions with an array of variants" do
110
- it "should simply assume the variant class exists" do
111
- @document = Document.new
112
- card = @document.address_cards.build(:uploaded_file => rails_icon)
113
- card.small_card.should.be.instance_of AddressCard::SmallCard
114
- card.big_card.should.be.instance_of AddressCard::BigCard
141
+ describe "AttachmentSan::Has, concerning attachment definitions overriding attachment base class options" do
142
+ it "should merge the options onto the attachment_san_options of the attachment model subclass" do
143
+ OtherDocument::Image.attachment_san_options[:base_path].should == '/other/base'
144
+ OtherDocument::Image.attachment_san_options[:public_base_path].should == '/other/public'
115
145
  end
116
146
  end
@@ -1,6 +1,5 @@
1
1
  ActiveRecord::Migration.verbose = false
2
2
  ActiveRecord::Schema.define(:version => 1) do
3
-
4
3
  create_table :attachments, :force => true do |t|
5
4
  t.string :filename
6
5
  t.string :content_type
@@ -10,5 +9,7 @@ ActiveRecord::Schema.define(:version => 1) do
10
9
 
11
10
  create_table :documents, :force => true do |t|
12
11
  end
13
-
12
+
13
+ create_table :other_documents, :force => true do |t|
14
+ end
14
15
  end
@@ -2,19 +2,19 @@ require File.expand_path('../test_helper', __FILE__)
2
2
 
3
3
  describe "AttachmentSan's variant class methods" do
4
4
  it "should return the variant class to use" do
5
- reflection = Logo.reflect_on_variant(:header)
5
+ reflection = Document::Logo.reflect_on_variant(:header)
6
6
  reflection[:class].should.be MyVariant
7
7
  end
8
8
 
9
9
  it "should by default use the AttachmentSan::Variant class" do
10
- reflection = Image.reflect_on_variant(:thumbnail)
10
+ reflection = Document::Image.reflect_on_variant(:thumbnail)
11
11
  reflection[:class].should.be AttachmentSan::Variant
12
12
  end
13
13
 
14
14
  it "should not define a variant twice" do
15
- count_before = Logo.variant_reflections.length
15
+ count_before = Document::Logo.variant_reflections.length
16
16
  Document.has_attachment :logo, :variants => { :header => MyVariant }
17
- Logo.variant_reflections.length.should == count_before
17
+ Document::Logo.variant_reflections.length.should == count_before
18
18
  end
19
19
  end
20
20
 
@@ -51,17 +51,28 @@ describe "A AttachmentSan::Variant instance in general" do
51
51
  end
52
52
 
53
53
  it "should return the extension of the original file" do
54
- Image.attachment_san_options[:extension] = :keep_original
54
+ Document::Image.attachment_san_options[:extension] = :keep_original
55
55
  @thumbnail.extension.should == 'png'
56
56
  end
57
57
 
58
58
  it "should use the extension specified in the attachment_san_options" do
59
- Image.attachment_san_options[:extension] = :jpeg
59
+ Document::Image.attachment_san_options[:extension] = :jpeg
60
60
  @thumbnail.extension.should == :jpeg
61
61
  end
62
62
 
63
+ it "should should use the base_path and public_base_path that were overridden on the has_attachment(s) definition" do
64
+ @document = OtherDocument.new
65
+ @image = @document.images.build(:uploaded_file => @upload)
66
+
67
+ @image.original.base_path.should == '/other/base'
68
+ @image.original.public_base_path.should == '/other/public'
69
+
70
+ @image.normal.base_path.should == '/yet/another/base'
71
+ @image.normal.public_base_path.should == '/other/public'
72
+ end
73
+
63
74
  it "should create the directory that the file_path returns" do
64
- Image.attachment_san_options[:filename_scheme] = :record_identifier
75
+ Document::Image.attachment_san_options[:filename_scheme] = :record_identifier
65
76
 
66
77
  @thumbnail.dir_path.should == File.dirname(@thumbnail.file_path)
67
78
  File.should.not.exist @thumbnail.dir_path
@@ -79,8 +90,8 @@ describe "A AttachmentSan::Variant instance in general" do
79
90
 
80
91
  { :keep_original => 'png', :jpg => 'jpg' }.each do |setting, ext|
81
92
  it "should return a filename named after the variant name plus #{setting}" do
82
- Image.attachment_san_options[:filename_scheme] = :variant_name
83
- Image.attachment_san_options[:extension] = setting
93
+ Document::Image.attachment_san_options[:filename_scheme] = :variant_name
94
+ Document::Image.attachment_san_options[:extension] = setting
84
95
 
85
96
  @thumbnail.filename.should == "thumbnail.#{ext}"
86
97
  @thumbnail.file_path.should == File.join(@thumbnail.base_path, "thumbnail.#{ext}")
@@ -91,9 +102,22 @@ describe "A AttachmentSan::Variant instance in general" do
91
102
  @medium_sized.public_path.should == File.join(@thumbnail.public_base_path, "medium_sized.#{ext}")
92
103
  end
93
104
 
105
+ it "should return the original filename and use extension #{setting}" do
106
+ Document::Image.attachment_san_options[:filename_scheme] = :keep_original
107
+ Document::Image.attachment_san_options[:extension] = setting
108
+
109
+ @image.original.filename.should == "rails.png"
110
+ @image.original.file_path.should == File.join(@thumbnail.base_path, "rails.png")
111
+ @image.original.public_path.should == File.join(@thumbnail.public_base_path, "rails.png")
112
+
113
+ @thumbnail.filename.should == "rails.thumbnail.#{ext}"
114
+ @thumbnail.file_path.should == File.join(@thumbnail.base_path, "rails.thumbnail.#{ext}")
115
+ @thumbnail.public_path.should == File.join(@thumbnail.public_base_path, "rails.thumbnail.#{ext}")
116
+ end
117
+
94
118
  it "should return a filename which should be a random token from the record and append #{setting}" do
95
- Image.attachment_san_options[:filename_scheme] = :token
96
- Image.attachment_san_options[:extension] = setting
119
+ Document::Image.attachment_san_options[:filename_scheme] = :token
120
+ Document::Image.attachment_san_options[:extension] = setting
97
121
  @image.stubs(:token).returns('556d2e8e')
98
122
 
99
123
  @image.original.filename.should == "55/6d/2e/8e/rails.png"
@@ -108,8 +132,8 @@ describe "A AttachmentSan::Variant instance in general" do
108
132
  it "should return a filename which is based on the record identifier and variant name plus #{setting}" do
109
133
  Attachment.reset!
110
134
 
111
- Image.attachment_san_options[:extension] = setting
112
- Image.attachment_san_options[:filename_scheme] = :record_identifier
135
+ Document::Image.attachment_san_options[:extension] = setting
136
+ Document::Image.attachment_san_options[:filename_scheme] = :record_identifier
113
137
  @image.save!
114
138
 
115
139
  @thumbnail.filename.should == "/images/#{@image.id}/thumbnail.#{ext}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attachment-san
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Duran
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-11-19 00:00:00 +01:00
13
+ date: 2009-12-01 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -36,6 +36,7 @@ files:
36
36
  - examples/photos_controller.rb
37
37
  - examples/post.rb
38
38
  - lib/attachment_san.rb
39
+ - lib/attachment_san/core_ext.rb
39
40
  - lib/attachment_san/has.rb
40
41
  - lib/attachment_san/test/helper.rb
41
42
  - lib/attachment_san/test/rails.png
@@ -43,6 +44,7 @@ files:
43
44
  - napkin.rb
44
45
  - rails/init.rb
45
46
  - test/attachment_san_test.rb
47
+ - test/core_ext_test.rb
46
48
  - test/fixtures/models/attachment.rb
47
49
  - test/fixtures/models/document.rb
48
50
  - test/fixtures/models/options_stub.rb
@@ -80,6 +82,7 @@ specification_version: 3
80
82
  summary: Rails plugin for easy and rich attachment manipulation.
81
83
  test_files:
82
84
  - test/attachment_san_test.rb
85
+ - test/core_ext_test.rb
83
86
  - test/fixtures/models/attachment.rb
84
87
  - test/fixtures/models/document.rb
85
88
  - test/fixtures/models/options_stub.rb