flickrmocks 0.8.5

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 (68) hide show
  1. data/.autotest +36 -0
  2. data/.document +5 -0
  3. data/.gitignore +23 -0
  4. data/.rspec +3 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +59 -0
  7. data/Rakefile +76 -0
  8. data/VERSION +1 -0
  9. data/autotest/discover.rb +1 -0
  10. data/flickrmocks.gemspec +155 -0
  11. data/lib/flickr_mocks/api/api.rb +42 -0
  12. data/lib/flickr_mocks/api/flickr.rb +27 -0
  13. data/lib/flickr_mocks/api/helpers.rb +19 -0
  14. data/lib/flickr_mocks/api/options.rb +55 -0
  15. data/lib/flickr_mocks/api/sanitize.rb +29 -0
  16. data/lib/flickr_mocks/fixtures.rb +35 -0
  17. data/lib/flickr_mocks/flickraw/custom_clone.rb +19 -0
  18. data/lib/flickr_mocks/flickraw/custom_compare.rb +25 -0
  19. data/lib/flickr_mocks/flickraw/custom_marshal.rb +39 -0
  20. data/lib/flickr_mocks/flickraw/flickraw.rb +14 -0
  21. data/lib/flickr_mocks/helpers.rb +52 -0
  22. data/lib/flickr_mocks/models/helpers.rb +14 -0
  23. data/lib/flickr_mocks/models/photo.rb +101 -0
  24. data/lib/flickr_mocks/models/photo_details.rb +86 -0
  25. data/lib/flickr_mocks/models/photo_dimensions.rb +103 -0
  26. data/lib/flickr_mocks/models/photo_search.rb +115 -0
  27. data/lib/flickr_mocks/models/photo_size.rb +60 -0
  28. data/lib/flickr_mocks/models/photo_sizes.rb +93 -0
  29. data/lib/flickr_mocks/models/photos.rb +133 -0
  30. data/lib/flickr_mocks/stubs.rb +103 -0
  31. data/lib/flickr_mocks/version.rb +4 -0
  32. data/lib/flickrmocks.rb +27 -0
  33. data/spec/api/api_spec.rb +84 -0
  34. data/spec/api/flickr_spec.rb +48 -0
  35. data/spec/api/helper_spec.rb +37 -0
  36. data/spec/api/options_spec.rb +152 -0
  37. data/spec/api/sanitize_spec.rb +90 -0
  38. data/spec/base/fixtures_spec.rb +89 -0
  39. data/spec/base/flickraw/custom_clone_spec.rb +70 -0
  40. data/spec/base/flickraw/custom_compare_spec.rb +98 -0
  41. data/spec/base/flickraw/custom_marshal_spec.rb +45 -0
  42. data/spec/base/helpers_spec.rb +63 -0
  43. data/spec/base/stubs_spec.rb +180 -0
  44. data/spec/base/version_spec.rb +15 -0
  45. data/spec/fixtures/author_photos.marshal +0 -0
  46. data/spec/fixtures/empty_photos.marshal +0 -0
  47. data/spec/fixtures/expected_methods.marshal +17 -0
  48. data/spec/fixtures/interesting_photos.marshal +0 -0
  49. data/spec/fixtures/photo.marshal +0 -0
  50. data/spec/fixtures/photo_details.marshal +0 -0
  51. data/spec/fixtures/photo_size.marshal +0 -0
  52. data/spec/fixtures/photo_sizes.marshal +0 -0
  53. data/spec/fixtures/photos.marshal +0 -0
  54. data/spec/models/helpers_spec.rb +25 -0
  55. data/spec/models/photo_details_spec.rb +224 -0
  56. data/spec/models/photo_dimensions_spec.rb +208 -0
  57. data/spec/models/photo_search_spec.rb +255 -0
  58. data/spec/models/photo_size_spec.rb +122 -0
  59. data/spec/models/photo_sizes_spec.rb +168 -0
  60. data/spec/models/photo_spec.rb +278 -0
  61. data/spec/models/photos_spec.rb +305 -0
  62. data/spec/shared_examples/array_accessor.rb +157 -0
  63. data/spec/shared_examples/collection.rb +49 -0
  64. data/spec/shared_examples/image_url_helpers.rb +56 -0
  65. data/spec/shared_examples/size_accessor.rb +13 -0
  66. data/spec/spec_helper.rb +24 -0
  67. data/tasks/fixtures.rb +164 -0
  68. metadata +259 -0
@@ -0,0 +1,39 @@
1
+ module FlickrMocks
2
+
3
+ module CustomMarshal
4
+
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ def _load(string)
11
+ data = Marshal.load(string)
12
+ type = data.delete('flickr_type')
13
+ FlickRaw::Response.build(data,type)
14
+ end
15
+ end
16
+
17
+ def _dump(level)
18
+ result = marshal_flickraw(self)
19
+ result["flickr_type"] = self.flickr_type
20
+ Marshal.dump result
21
+ end
22
+
23
+ private
24
+ def marshal_flickraw(obj)
25
+ r = {}
26
+ obj.methods(false).each do |k|
27
+ v = obj.send k.to_sym
28
+ r[k.to_s] = case v
29
+ when Array then v.collect {|e| marshal_flickraw(e)}
30
+ when FlickRaw::Response then marshal_flickraw(v)
31
+ when FlickRaw::ResponseList then marshal_flickraw(v)
32
+ else v
33
+ end
34
+ end
35
+ r
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,14 @@
1
+ module FlickRaw
2
+
3
+ class Response
4
+ include FlickrMocks::CustomMarshal
5
+ include FlickrMocks::CustomCompare
6
+ include FlickrMocks::CustomClone
7
+ end
8
+
9
+ class ResponseList
10
+ include FlickrMocks::CustomMarshal
11
+ include FlickrMocks::CustomCompare
12
+ include FlickrMocks::CustomClone
13
+ end
14
+ end
@@ -0,0 +1,52 @@
1
+ module FlickrMocks
2
+ module Helpers
3
+
4
+ class << self
5
+ def extension
6
+ ".marshal"
7
+ end
8
+
9
+ def fname_fixture(symbol)
10
+ raise RunTimeError unless symbol.is_a? Symbol
11
+ symbol.to_s + extension
12
+ end
13
+
14
+ def equivalent?(a,b)
15
+ return false if a.class != b.class
16
+ case a
17
+ when FlickRaw::Response,FlickRaw::ResponseList then a.methods(false).collect do |m|
18
+ b.respond_to?(m) ? equivalent?(a.send(m),b.send(m)) : false
19
+ end.inject(true) {|r1,r2| r1 && r2}
20
+
21
+ when Hash then a.keys.collect do |k|
22
+ b.has_key?(k) ? equivalent?(a[k],b[k]) : false
23
+ end.inject(true){|r1,r2| r1 && r2}
24
+
25
+ when Array then a.each_with_index.collect do |v,i|
26
+ b.length == a.length ? equivalent?(v,b[i]) : false
27
+ end.inject(true) {|r1,r2| r1 && r2}
28
+ else
29
+ a == b
30
+ end
31
+ end
32
+
33
+ def dump(response,file)
34
+ begin
35
+ f = File.open(file,'w')
36
+ f.write Marshal.dump(response)
37
+ ensure
38
+ f.close
39
+ end
40
+ end
41
+
42
+ def load(file)
43
+ begin
44
+ f=File.open(file,'r')
45
+ Marshal.load(f)
46
+ ensure
47
+ f.close
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,14 @@
1
+ module FlickrMocks
2
+ module Models
3
+ module Helpers
4
+ def self.array_accessor_methods
5
+ [:[], :first, :last,:empty?,:length,:size,:each,:each_index,
6
+ :map, :select, :keep_if,:at,:fetch, :reverse_each,
7
+ :find_index, :index,:rindex, :collect,:values_at]
8
+ end
9
+ def self.possible_sizes
10
+ [:square, :thumbnail, :small, :medium, :medium_640, :large, :original]
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,101 @@
1
+ module FlickrMocks
2
+
3
+ class Photo
4
+ def initialize(photo)
5
+ self.delegated_to_object = photo
6
+ @delegated_instance_methods = @delegated_to_object.methods(false).push(:flickr_type)
7
+ @extended_photo = photo.methods.include?(:originalsecret)
8
+ end
9
+
10
+ # Return urls for various sizes
11
+ def square
12
+ FlickRaw.url_s self
13
+ end
14
+
15
+ def original
16
+ respond_to?(:originalsecret) ? FlickRaw.url_o(self) : nil
17
+ end
18
+
19
+ def thumbnail
20
+ FlickRaw.url_t self
21
+ end
22
+
23
+ def small
24
+ FlickRaw.url_m self
25
+ end
26
+
27
+ def medium
28
+ FlickRaw.url self
29
+ end
30
+
31
+ def large
32
+ FlickRaw.url_b self
33
+ end
34
+
35
+ def medium_640
36
+ FlickRaw.url_z self
37
+ end
38
+
39
+ def owner_url
40
+ FlickRaw.url_photopage self
41
+ end
42
+
43
+
44
+ def owner_id
45
+ case owner
46
+ when String then owner
47
+ else
48
+ return owner.nsid if owner.respond_to?(:nsid)
49
+ return owner.to_s
50
+ end
51
+ end
52
+
53
+ def photo_id
54
+ id
55
+ end
56
+
57
+ def usable?
58
+ license.to_i > 3
59
+ end
60
+
61
+ def ==(other)
62
+ @delegated_to_object == other.instance_eval('@delegated_to_object')
63
+ end
64
+
65
+ def initialize_copy(orig)
66
+ super
67
+ @delegated_to_object = @delegated_to_object.clone
68
+ end
69
+
70
+ def delegated_instance_methods
71
+ @delegated_instance_methods
72
+ end
73
+
74
+
75
+ def method_missing(id,*args,&block)
76
+ return @delegated_to_object.send(id,*args,&block) if delegated_instance_methods.include?(id)
77
+ return medium_640 if id.to_sym == :'medium 640'
78
+ super
79
+ end
80
+
81
+ alias :old_respond_to? :respond_to?
82
+ def respond_to?(method,type=false)
83
+ return true if method.to_sym == :'medium 640'
84
+ return true if delegated_instance_methods.include?(method)
85
+ old_respond_to?(method,type)
86
+ end
87
+
88
+ alias :old_methods :methods
89
+ def methods
90
+ delegated_instance_methods + old_methods
91
+ end
92
+
93
+
94
+ private
95
+ def delegated_to_object=(object)
96
+ raise ArgumentError, "FlickRaw::ResponseList expected" if object.class == FlickRaw::ResponseList
97
+ raise ArgumentError, 'FlickRaw::Response expected' unless object.class == FlickRaw::Response
98
+ @delegated_to_object = object
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,86 @@
1
+ module FlickrMocks
2
+ class PhotoDetails
3
+ attr_reader :dimensions
4
+
5
+ def initialize(photo,dimensions)
6
+ self.dimensions = dimensions
7
+ self.delegated_to_object= photo
8
+ raise ArgumentError 'owner id for photo did not match owner id for at least one size' unless valid_owner_for_dimensions?
9
+ end
10
+
11
+ def owner_name
12
+ self.owner.realname
13
+ end
14
+
15
+ def owner_username
16
+ self.owner.username
17
+ end
18
+
19
+ def dimensions
20
+ @dimensions
21
+ end
22
+
23
+ def photo
24
+ @delegated_to_object
25
+ end
26
+
27
+ def possible_sizes
28
+ FlickrMocks::Models::Helpers.possible_sizes
29
+ end
30
+
31
+ def ==(other)
32
+ return false unless other.class == PhotoDetails
33
+ (dimensions == other.dimensions) && (@delegated_to_object == other.instance_eval('@delegated_to_object'))
34
+ end
35
+
36
+ # metaprogramming methods
37
+ def method_missing(id,*args,&block)
38
+ return dimensions.sizes.send(id,*args,&block) if array_accessor_methods.include?(id)
39
+ return @delegated_to_object.send(id,*args,&block) if delegated_instance_methods.include?(id)
40
+ super
41
+ end
42
+
43
+ alias :old_respond_to? :respond_to?
44
+ def respond_to?(method,type=false)
45
+ delegated_instance_methods.include?(method) || old_respond_to?(method)
46
+ end
47
+
48
+ alias :old_methods :methods
49
+ def methods
50
+ delegated_instance_methods + old_methods
51
+ end
52
+
53
+ def delegated_instance_methods
54
+ @delegated_to_object.delegated_instance_methods + array_accessor_methods + [:owner_id] + possible_sizes
55
+ end
56
+
57
+ # custom cloning methods
58
+ def initialize_copy(orig)
59
+ super
60
+ @dimensions = @dimensions.clone
61
+ @delegated_to_object = @delegated_to_object.clone
62
+ end
63
+
64
+
65
+
66
+ private
67
+ def dimensions=(object)
68
+ @dimensions = object.class == PhotoSizes ? object : PhotoSizes.new(object)
69
+ end
70
+
71
+ def delegated_to_object=(object)
72
+ @delegated_to_object = object.is_a?(Photo) ? object : Photo.new(object)
73
+ end
74
+
75
+ def valid_owner_for_dimensions?
76
+ dimensions.map do |size|
77
+ photo.id == size.id
78
+ end.inject(true) do |prev,cur| prev && cur end
79
+ end
80
+
81
+ def array_accessor_methods
82
+ FlickrMocks::Models::Helpers.array_accessor_methods
83
+ end
84
+
85
+ end
86
+ end
@@ -0,0 +1,103 @@
1
+ require 'ostruct'
2
+
3
+ module FlickrMocks
4
+ class PhotoDimensions
5
+ # sizes that are recognized by class. The sizes are in order from smallest to largest
6
+ @regexp_size = /^[a-z]+(_\d+)?:\d+x\d+(,[a-z]+(_\d+)?:\d+x\d+)*$/
7
+
8
+
9
+ class << self
10
+ attr_reader :regexp_size
11
+ end
12
+
13
+ def initialize(data)
14
+ self.delegated_to_object = data
15
+ end
16
+
17
+ def available_sizes
18
+ map do |dimension|
19
+ dimension.size
20
+ end
21
+ end
22
+
23
+ def dimensions
24
+ @delegated_to_object
25
+ end
26
+
27
+ def collection
28
+ @collection ||= ::WillPaginate::Collection.create(1, available_sizes.length, available_sizes.length) do |obj|
29
+ obj.replace(dimensions)
30
+ end
31
+ @collection
32
+ end
33
+
34
+ def to_s
35
+ dimensions.map do |dimension|
36
+ [dimension.size,[dimension.width,dimension.height].join('x')].join(':')
37
+ end.join(',')
38
+ end
39
+
40
+ def ==(other)
41
+ return false unless other.class.should == self.class
42
+ to_s == other.to_s
43
+ end
44
+
45
+ # metaprogramming methods
46
+ alias :old_respond_to? :respond_to?
47
+ def respond_to?(method)
48
+ valid_size?(method) || delegated_instance_methods.include?(method) || old_respond_to?(method)
49
+ end
50
+
51
+ def method_missing(id,*args,&block)
52
+ return get_size(id,*args,&block) if valid_size?(id)
53
+ return dimensions.send(id,*args,&block) if delegated_instance_methods.include?(id)
54
+ super
55
+ end
56
+
57
+ alias :old_methods :methods
58
+ def methods
59
+ available_sizes + delegated_instance_methods + old_methods
60
+ end
61
+
62
+ def delegated_instance_methods
63
+ Models::Helpers.array_accessor_methods
64
+ end
65
+
66
+ # custom cloning methods
67
+ def initialize_copy(other)
68
+ super
69
+ @delegated_to_object = @delegated_to_object.map do |object|
70
+ object.clone
71
+ end
72
+ end
73
+
74
+ def possible_sizes
75
+ FlickrMocks::Models::Helpers.possible_sizes
76
+ end
77
+ private
78
+ def delegated_to_object=(data)
79
+ raise(ArgumentError, "Invalid #{data} must respond to :to_s") unless data.respond_to?(:to_s)
80
+ # expecting strings of type: "square:1x1,thumbnail:2x2,small:3x3,medium:4x4,medium_640:4x4,large:5x5,original:6x6"
81
+ raise(ArgumentError, "Invalid string format") unless data =~ PhotoDimensions.regexp_size
82
+
83
+ @delegated_to_object= data.to_s.split(',').map do |fields|
84
+ size,dim = fields.split(':')
85
+ size= size.to_sym
86
+ raise(ArgumentError,"Invalid size provided #{size}") unless valid_size?(size)
87
+ width,height=dim.split(/x/)
88
+ OpenStruct.new :size => size,:width => width.to_i,:height => height.to_i
89
+ end
90
+ end
91
+
92
+ def valid_size?(data)
93
+ possible_sizes.include?(data.to_sym)
94
+ end
95
+
96
+ def get_size(size)
97
+ dimensions.keep_if do |dimension|
98
+ dimension.size == size
99
+ end.first
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,115 @@
1
+ module FlickrMocks
2
+ class PhotoSearch
3
+ attr_reader :search_terms,:page,:date
4
+
5
+ @defaults = {
6
+ :page => 1
7
+ }
8
+
9
+ @delegated_instance_methods = [:current_page, :per_page, :total_entries, :capped_entries,:perpage, :capped?,
10
+ :max_entries, :collection]
11
+
12
+ class << self
13
+ attr_accessor :defaults
14
+ attr_accessor :delegated_instance_methods
15
+ end
16
+
17
+ def initialize(data,options={})
18
+ self.delegated_to_object = data
19
+ self.search_terms = options[:search_terms]
20
+ self.page = options[:page]
21
+ self.date = options[:date]
22
+ end
23
+
24
+ def default(value)
25
+ PhotoSearch.defaults[value.to_sym]
26
+ end
27
+
28
+ def photos
29
+ @delegated_to_object
30
+ end
31
+
32
+ def total_results
33
+ total_entries
34
+ end
35
+
36
+ def url_params
37
+ { :search_terms => search_terms,
38
+ :date => (date.nil? && search_terms.empty?) ? Api.time : date
39
+ }.keep_if do |k,v| !(v.nil? || v.to_s.empty?) end
40
+ end
41
+
42
+ def ==(other)
43
+ return false unless other.class == self.class
44
+ (photos == other.photos) && [:search_terms,:page,:date].inject(true) do |state,method|
45
+ state && (self.send(method) == other.send(method))
46
+ end
47
+ end
48
+
49
+ # metaprogramming methods
50
+ def method_missing(id,*args,&block)
51
+ return photos.photos.send(id,*args,&block) if delegated_array_accessor_methods.include?(id)
52
+ return photos.send(id,*args,&block) if delegated_instance_methods.include?(id)
53
+ super
54
+ end
55
+
56
+ alias :old_respond_to? :respond_to?
57
+ def respond_to?(method)
58
+ delegated_instance_methods.include?(method) || old_respond_to?(method)
59
+ end
60
+
61
+ alias :old_methods :methods
62
+ def methods
63
+ delegated_instance_methods + old_methods
64
+ end
65
+
66
+ def delegated_instance_methods
67
+ PhotoSearch.delegated_instance_methods + delegated_array_accessor_methods
68
+ end
69
+
70
+
71
+ # custom cloning methods
72
+ def initialize_copy(other)
73
+ super
74
+ @delegated_to_object = @delegated_to_object.clone
75
+ end
76
+
77
+ private
78
+
79
+ def delegated_to_object=(data)
80
+ @delegated_to_object = case data
81
+ when FlickRaw::ResponseList then Photos.new(data)
82
+ when Photos then data
83
+ else raise ArgumentError, "expecting object of class Photos or FlickRaw::ResponseList"
84
+ end
85
+
86
+ end
87
+
88
+ def search_terms=(terms=nil)
89
+ terms ||= ''
90
+ raise ArgumentError, "Expecting String but got #{terms.class}" unless terms.is_a?(String)
91
+ @search_terms = terms
92
+ end
93
+
94
+ def page=(page=nil)
95
+ page ||= default(:page)
96
+ raise ArgumentError, "Expecting Fixnum but got #{page.class}" unless page.is_a?(Fixnum) or page.is_a?(String)
97
+ @page = page.to_i
98
+ end
99
+
100
+ def date=(date=nil)
101
+ raise ArgumentError, "Expecting String but got #{date.class}" unless date.is_a?(String) or date.nil?
102
+ begin
103
+ Chronic.parse(date) unless date.nil?
104
+ rescue
105
+ raise ArgumentError, "#{date} string can not be converted to Time object"
106
+ end
107
+ @date = date
108
+ end
109
+
110
+ def delegated_array_accessor_methods
111
+ FlickrMocks::Models::Helpers.array_accessor_methods
112
+ end
113
+
114
+ end
115
+ end
@@ -0,0 +1,60 @@
1
+ module FlickrMocks
2
+
3
+ class PhotoSize
4
+ def initialize(object)
5
+ self.delegated_to_object= object
6
+ end
7
+
8
+ def size
9
+ label.to_s.downcase.sub(/\s+/,'_')
10
+ end
11
+
12
+ def id
13
+ source.split('/')[-1].split('_')[0]
14
+ end
15
+
16
+ def secret
17
+ source.split('/')[-1].split('_')[1]
18
+ end
19
+
20
+ def ==(other)
21
+ @delegated_to_object == other.instance_eval('@delegated_to_object')
22
+ end
23
+
24
+ # metaprogramming methods
25
+ def delegated_instance_methods
26
+ @delegated_to_object.methods(false).push(:flickr_type)
27
+ end
28
+
29
+ def method_missing(id,*args,&block)
30
+ return @delegated_to_object.send(id,*args,&block) if delegated_instance_methods.include?(id)
31
+ super
32
+ end
33
+
34
+ alias :old_respond_to? :respond_to?
35
+ def respond_to?(method,type=false)
36
+ return true if delegated_instance_methods.include?(method)
37
+ old_respond_to?(method,type)
38
+ end
39
+
40
+ alias :old_methods :methods
41
+ def methods
42
+ delegated_instance_methods + old_methods
43
+ end
44
+
45
+ # cloning and copying methods
46
+ def initialize_copy(orig)
47
+ super
48
+ @delegated_to_object = @delegated_to_object.clone
49
+ end
50
+
51
+
52
+ private
53
+
54
+ def delegated_to_object=(data)
55
+ raise ArgumentError, 'FlickRaw::Response expected' if data.class == FlickRaw::ResponseList
56
+ raise ArgumentError, 'FlickRaw::Response expected' unless data.is_a? FlickRaw::Response
57
+ @delegated_to_object = data
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,93 @@
1
+ module FlickrMocks
2
+ class PhotoSizes
3
+
4
+ def initialize(object)
5
+ self.delegated_to_object= object
6
+ end
7
+
8
+ def id
9
+ @delegated_to_object.first.id
10
+ end
11
+
12
+ def secret
13
+ @delegated_to_object.first.secret
14
+ end
15
+
16
+ def sizes
17
+ @delegated_to_object
18
+ end
19
+
20
+ def available_sizes
21
+ @available_sizes ||= sizes.map do |size|
22
+ size.size.to_sym
23
+ end
24
+ @available_sizes
25
+ end
26
+
27
+ def collection
28
+ @collection ||= ::WillPaginate::Collection.create(1, sizes.length, sizes.length) do |obj|
29
+ obj.replace(sizes)
30
+ end
31
+ @collection
32
+ end
33
+
34
+
35
+ def to_s
36
+ PhotoDimensions.new(@delegated_to_object.map do |size|
37
+ "#{size.size}:#{size.width}x#{size.height}"
38
+ end.join(',')).to_s
39
+ end
40
+
41
+ def ==(other)
42
+ return false unless self.class == other.class
43
+ @delegated_to_object == other.instance_eval('@delegated_to_object')
44
+ end
45
+
46
+ def possible_sizes
47
+ Models::Helpers.possible_sizes
48
+ end
49
+
50
+ # metaprogramming methods
51
+ alias :old_methods :methods
52
+ def methods
53
+ delegated_instance_methods + old_methods
54
+ end
55
+
56
+ def method_missing(id,*args,&block)
57
+ return @delegated_to_object.send(id,*args,&block) if delegated_instance_methods.include?(id)
58
+ return nil if possible_sizes.include?(name)
59
+ super
60
+ end
61
+
62
+ alias :old_respond_to? :respond_to?
63
+ def respond_to?(method)
64
+ old_respond_to?(method) || delegated_instance_methods.include?(method)
65
+ end
66
+
67
+ def delegated_instance_methods
68
+ possible_sizes + FlickrMocks::Models::Helpers.array_accessor_methods
69
+ end
70
+
71
+ # cloning methods
72
+ def initialize_copy(orig)
73
+ super
74
+ @delegated_to_object = @delegated_to_object.map do |data|
75
+ data.clone
76
+ end
77
+ end
78
+
79
+
80
+ private
81
+
82
+ def delegated_to_object=(data)
83
+ raise ArgumentError, 'FlickRaw::Response expected' unless data.class == FlickRaw::ResponseList
84
+ @delegated_to_object = []
85
+ data.each do |datum|
86
+ @delegated_to_object.push PhotoSize.new datum
87
+ end
88
+ end
89
+
90
+
91
+ end
92
+ end
93
+