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.
- data/.autotest +36 -0
- data/.document +5 -0
- data/.gitignore +23 -0
- data/.rspec +3 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +59 -0
- data/Rakefile +76 -0
- data/VERSION +1 -0
- data/autotest/discover.rb +1 -0
- data/flickrmocks.gemspec +155 -0
- data/lib/flickr_mocks/api/api.rb +42 -0
- data/lib/flickr_mocks/api/flickr.rb +27 -0
- data/lib/flickr_mocks/api/helpers.rb +19 -0
- data/lib/flickr_mocks/api/options.rb +55 -0
- data/lib/flickr_mocks/api/sanitize.rb +29 -0
- data/lib/flickr_mocks/fixtures.rb +35 -0
- data/lib/flickr_mocks/flickraw/custom_clone.rb +19 -0
- data/lib/flickr_mocks/flickraw/custom_compare.rb +25 -0
- data/lib/flickr_mocks/flickraw/custom_marshal.rb +39 -0
- data/lib/flickr_mocks/flickraw/flickraw.rb +14 -0
- data/lib/flickr_mocks/helpers.rb +52 -0
- data/lib/flickr_mocks/models/helpers.rb +14 -0
- data/lib/flickr_mocks/models/photo.rb +101 -0
- data/lib/flickr_mocks/models/photo_details.rb +86 -0
- data/lib/flickr_mocks/models/photo_dimensions.rb +103 -0
- data/lib/flickr_mocks/models/photo_search.rb +115 -0
- data/lib/flickr_mocks/models/photo_size.rb +60 -0
- data/lib/flickr_mocks/models/photo_sizes.rb +93 -0
- data/lib/flickr_mocks/models/photos.rb +133 -0
- data/lib/flickr_mocks/stubs.rb +103 -0
- data/lib/flickr_mocks/version.rb +4 -0
- data/lib/flickrmocks.rb +27 -0
- data/spec/api/api_spec.rb +84 -0
- data/spec/api/flickr_spec.rb +48 -0
- data/spec/api/helper_spec.rb +37 -0
- data/spec/api/options_spec.rb +152 -0
- data/spec/api/sanitize_spec.rb +90 -0
- data/spec/base/fixtures_spec.rb +89 -0
- data/spec/base/flickraw/custom_clone_spec.rb +70 -0
- data/spec/base/flickraw/custom_compare_spec.rb +98 -0
- data/spec/base/flickraw/custom_marshal_spec.rb +45 -0
- data/spec/base/helpers_spec.rb +63 -0
- data/spec/base/stubs_spec.rb +180 -0
- data/spec/base/version_spec.rb +15 -0
- data/spec/fixtures/author_photos.marshal +0 -0
- data/spec/fixtures/empty_photos.marshal +0 -0
- data/spec/fixtures/expected_methods.marshal +17 -0
- data/spec/fixtures/interesting_photos.marshal +0 -0
- data/spec/fixtures/photo.marshal +0 -0
- data/spec/fixtures/photo_details.marshal +0 -0
- data/spec/fixtures/photo_size.marshal +0 -0
- data/spec/fixtures/photo_sizes.marshal +0 -0
- data/spec/fixtures/photos.marshal +0 -0
- data/spec/models/helpers_spec.rb +25 -0
- data/spec/models/photo_details_spec.rb +224 -0
- data/spec/models/photo_dimensions_spec.rb +208 -0
- data/spec/models/photo_search_spec.rb +255 -0
- data/spec/models/photo_size_spec.rb +122 -0
- data/spec/models/photo_sizes_spec.rb +168 -0
- data/spec/models/photo_spec.rb +278 -0
- data/spec/models/photos_spec.rb +305 -0
- data/spec/shared_examples/array_accessor.rb +157 -0
- data/spec/shared_examples/collection.rb +49 -0
- data/spec/shared_examples/image_url_helpers.rb +56 -0
- data/spec/shared_examples/size_accessor.rb +13 -0
- data/spec/spec_helper.rb +24 -0
- data/tasks/fixtures.rb +164 -0
- 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
|
+
|