flickrmocks 0.8.15 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile.lock +123 -0
  3. data/README.rdoc +104 -30
  4. data/Rakefile +12 -0
  5. data/flickrmocks.gemspec +3 -1
  6. data/lib/flickr_mocks/api/api.rb +80 -27
  7. data/lib/flickr_mocks/api/flickr.rb +69 -23
  8. data/lib/flickr_mocks/api/helpers.rb +25 -12
  9. data/lib/flickr_mocks/api/options.rb +71 -53
  10. data/lib/flickr_mocks/api/sanitize.rb +129 -20
  11. data/lib/flickr_mocks/fixtures.rb +7 -1
  12. data/lib/flickr_mocks/flickraw/custom_clone.rb +3 -1
  13. data/lib/flickr_mocks/flickraw/custom_compare.rb +4 -0
  14. data/lib/flickr_mocks/flickraw/custom_marshal.rb +7 -2
  15. data/lib/flickr_mocks/flickraw/flickraw.rb +6 -0
  16. data/lib/flickr_mocks/helpers.rb +8 -1
  17. data/lib/flickr_mocks/models/commons_institution.rb +45 -34
  18. data/lib/flickr_mocks/models/commons_institutions.rb +85 -75
  19. data/lib/flickr_mocks/models/helpers.rb +13 -6
  20. data/lib/flickr_mocks/models/models.rb +7 -0
  21. data/lib/flickr_mocks/models/photo.rb +76 -75
  22. data/lib/flickr_mocks/models/photo_details.rb +71 -69
  23. data/lib/flickr_mocks/models/photo_dimensions.rb +80 -78
  24. data/lib/flickr_mocks/models/photo_search.rb +115 -88
  25. data/lib/flickr_mocks/models/photo_size.rb +57 -56
  26. data/lib/flickr_mocks/models/photo_sizes.rb +68 -67
  27. data/lib/flickr_mocks/models/photos.rb +104 -99
  28. data/lib/flickr_mocks/stubs.rb +151 -14
  29. data/lib/flickr_mocks/version.rb +7 -1
  30. data/spec/api/api_spec.rb +26 -8
  31. data/spec/api/flickr_spec.rb +19 -19
  32. data/spec/api/helper_spec.rb +20 -20
  33. data/spec/api/options_spec.rb +170 -124
  34. data/spec/api/sanitize_spec.rb +174 -59
  35. data/spec/base/stubs_spec.rb +37 -74
  36. data/spec/base/version_spec.rb +11 -4
  37. data/spec/models/commons_institution_spec.rb +3 -2
  38. data/spec/models/commons_institutions_spec.rb +34 -5
  39. data/spec/models/helpers_spec.rb +7 -6
  40. data/spec/models/photo_details_spec.rb +12 -11
  41. data/spec/models/photo_dimensions_spec.rb +5 -4
  42. data/spec/models/photo_search_spec.rb +50 -8
  43. data/spec/models/photo_size_spec.rb +4 -3
  44. data/spec/models/photo_sizes_spec.rb +6 -5
  45. data/spec/models/photo_spec.rb +6 -4
  46. data/spec/models/photos_spec.rb +9 -7
  47. data/spec/shared_examples/hash_options/date_hash_option.rb +42 -0
  48. data/spec/shared_examples/hash_options/page_hash_option.rb +23 -0
  49. data/spec/shared_examples/hash_options/perpage_hash_option.rb +43 -0
  50. data/spec/shared_examples/hash_options/tag_mode_hash_option.rb +31 -0
  51. data/spec/shared_examples/stub_helpers.rb +140 -0
  52. data/spec/spec_helper.rb +5 -5
  53. metadata +55 -16
@@ -1,103 +1,105 @@
1
1
  require 'ostruct'
2
2
 
3
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+)*$/
4
+ module Models
5
+ class PhotoDimensions
6
+ # sizes that are recognized by class. The sizes are in order from smallest to largest
7
+ @regexp_size = /^[a-z]+(_\d+)?:\d+x\d+(,[a-z]+(_\d+)?:\d+x\d+)*$/
7
8
 
8
9
 
9
- class << self
10
- attr_reader :regexp_size
11
- end
10
+ class << self
11
+ attr_reader :regexp_size
12
+ end
12
13
 
13
- def initialize(data)
14
- self.delegated_to_object = data
15
- end
14
+ def initialize(data)
15
+ self.delegated_to_object = data
16
+ end
16
17
 
17
- def available_sizes
18
- map do |dimension|
19
- dimension.size
20
- end
21
- end
18
+ def available_sizes
19
+ map do |dimension|
20
+ dimension.size
21
+ end
22
+ end
22
23
 
23
- def dimensions
24
- @delegated_to_object
25
- end
24
+ def dimensions
25
+ @delegated_to_object
26
+ end
26
27
 
27
- def collection
28
- @collection ||= ::WillPaginate::Collection.create(1, available_sizes.length, available_sizes.length) do |obj|
29
- obj.replace(dimensions)
28
+ def collection
29
+ @collection ||= ::WillPaginate::Collection.create(1, available_sizes.length, available_sizes.length) do |obj|
30
+ obj.replace(dimensions)
31
+ end
32
+ @collection
30
33
  end
31
- @collection
32
- end
33
34
 
34
- def to_s
35
- dimensions.map do |dimension|
36
- [dimension.size,[dimension.width,dimension.height].join('x')].join(':')
37
- end.join(',')
38
- end
35
+ def to_s
36
+ dimensions.map do |dimension|
37
+ [dimension.size,[dimension.width,dimension.height].join('x')].join(':')
38
+ end.join(',')
39
+ end
39
40
 
40
- def ==(other)
41
- return false unless other.class.should == self.class
42
- to_s == other.to_s
43
- end
41
+ def ==(other)
42
+ return false unless other.class.should == self.class
43
+ to_s == other.to_s
44
+ end
44
45
 
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
46
+ # metaprogramming methods
47
+ alias :old_respond_to? :respond_to?
48
+ def respond_to?(method)
49
+ valid_size?(method) || delegated_instance_methods.include?(method) || old_respond_to?(method)
50
+ end
50
51
 
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
52
+ def method_missing(id,*args,&block)
53
+ return get_size(id,*args,&block) if valid_size?(id)
54
+ return dimensions.send(id,*args,&block) if delegated_instance_methods.include?(id)
55
+ super
56
+ end
56
57
 
57
- alias :old_methods :methods
58
- def methods
59
- available_sizes + delegated_instance_methods + old_methods
60
- end
58
+ alias :old_methods :methods
59
+ def methods
60
+ available_sizes + delegated_instance_methods + old_methods
61
+ end
61
62
 
62
- def delegated_instance_methods
63
- Models::Helpers.array_accessor_methods
64
- end
63
+ def delegated_instance_methods
64
+ Models::Helpers.array_accessor_methods
65
+ end
65
66
 
66
- # custom cloning methods
67
- def initialize_copy(other)
68
- super
69
- @delegated_to_object = @delegated_to_object.map do |object|
70
- object.clone
67
+ # custom cloning methods
68
+ def initialize_copy(other)
69
+ super
70
+ @delegated_to_object = @delegated_to_object.map do |object|
71
+ object.clone
72
+ end
71
73
  end
72
- end
73
74
 
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
75
+ def possible_sizes
76
+ FlickrMocks::Models::Helpers.possible_sizes
77
+ end
78
+ private
79
+ def delegated_to_object=(data)
80
+ raise(ArgumentError, "Invalid #{data} must respond to :to_s") unless data.respond_to?(:to_s)
81
+ # expecting strings of type: "square:1x1,thumbnail:2x2,small:3x3,medium:4x4,medium_640:4x4,large:5x5,original:6x6"
82
+ raise(ArgumentError, "Invalid string format") unless data =~ PhotoDimensions.regexp_size
83
+
84
+ @delegated_to_object= data.to_s.split(',').map do |fields|
85
+ size,dim = fields.split(':')
86
+ size= size.to_sym
87
+ raise(ArgumentError,"Invalid size provided #{size}") unless valid_size?(size)
88
+ width,height=dim.split(/x/)
89
+ OpenStruct.new :size => size,:width => width.to_i,:height => height.to_i
90
+ end
89
91
  end
90
- end
91
92
 
92
- def valid_size?(data)
93
- possible_sizes.include?(data.to_sym)
94
- end
93
+ def valid_size?(data)
94
+ possible_sizes.include?(data.to_sym)
95
+ end
95
96
 
96
- def get_size(size)
97
- dimensions.keep_if do |dimension|
98
- dimension.size == size
99
- end.first
100
- end
97
+ def get_size(size)
98
+ dimensions.keep_if do |dimension|
99
+ dimension.size == size
100
+ end.first
101
+ end
101
102
 
103
+ end
102
104
  end
103
105
  end
@@ -1,115 +1,142 @@
1
1
  module FlickrMocks
2
- class PhotoSearch
3
- attr_reader :search_terms,:page,:date
2
+ module Models
3
+ class PhotoSearch
4
+ attr_reader :search_terms,:page,:date
4
5
 
5
- @defaults = {
6
- :page => 1
7
- }
6
+ @defaults = {
7
+ :page => 1
8
+ }
8
9
 
9
- @delegated_instance_methods = [:current_page, :per_page, :total_entries, :capped_entries,:perpage, :capped?,
10
- :max_entries, :collection]
10
+ @delegated_instance_methods = [:current_page, :per_page, :total_entries, :capped_entries,:perpage, :capped?,
11
+ :max_entries, :collection]
11
12
 
12
- class << self
13
- attr_accessor :defaults
14
- attr_accessor :delegated_instance_methods
15
- end
13
+ class << self
14
+ attr_accessor :defaults
15
+ attr_accessor :delegated_instance_methods
16
+ end
16
17
 
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
18
+ def initialize(data,options={})
19
+ self.delegated_to_object = data
20
+ self.search_terms = extract_search_terms(options)
21
+ self.page = extract_page(options)
22
+ self.date = extract_date(options)
23
+ end
23
24
 
24
- def default(value)
25
- PhotoSearch.defaults[value.to_sym]
26
- end
27
25
 
28
- def photos
29
- @delegated_to_object
30
- end
31
-
32
- def total_results
33
- total_entries
34
- end
26
+ # returns the string stored in the :search_terms tag. The string is stripped
27
+ # of spurious spaces and is made to be lower case.
28
+ def extract_search_terms(params)
29
+ Api::Sanitize.tags(params[:search_terms])
30
+ end
35
31
 
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
32
+ def extract_date(params)
33
+ date = params[:date]
34
+ case date
35
+ when NilClass
36
+ nil
37
+ when String
38
+ Api::Helpers.valid_date?(date) ? Api::Helpers.date(date) : raise(ArgumentError)
39
+ else
40
+ raise ArgumentError
41
+ end
42
+ end
41
43
 
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))
44
+ def extract_page(params)
45
+ Api::Sanitize.page(params[:page])
46
46
  end
47
- end
48
47
 
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
48
+ # returns the default class instance value corresponding to the supplied key.
49
+ def default(value)
50
+ PhotoSearch.defaults[value.to_sym]
51
+ end
55
52
 
56
- alias :old_respond_to? :respond_to?
57
- def respond_to?(method)
58
- delegated_instance_methods.include?(method) || old_respond_to?(method)
59
- end
53
+ # returns the list of photo objects returned by search
54
+ def photos
55
+ @delegated_to_object
56
+ end
57
+
58
+ def total_results
59
+ total_entries
60
+ end
60
61
 
61
- alias :old_methods :methods
62
- def methods
63
- delegated_instance_methods + old_methods
64
- end
62
+ def url_params
63
+ { :search_terms => search_terms,
64
+ :date => (date.nil? && search_terms.empty?) ? Api::Helpers.date : date
65
+ }.keep_if do |k,v| !(v.nil? || v.to_s.empty?) end
66
+ end
65
67
 
66
- def delegated_instance_methods
67
- PhotoSearch.delegated_instance_methods + delegated_array_accessor_methods
68
- end
68
+ def ==(other)
69
+ return false unless other.class == self.class
70
+ (photos == other.photos) && [:search_terms,:page,:date].inject(true) do |state,method|
71
+ state && (self.send(method) == other.send(method))
72
+ end
73
+ end
69
74
 
75
+ # metaprogramming methods
76
+ def method_missing(id,*args,&block)
77
+ return photos.photos.send(id,*args,&block) if delegated_array_accessor_methods.include?(id)
78
+ return photos.send(id,*args,&block) if delegated_instance_methods.include?(id)
79
+ super
80
+ end
70
81
 
71
- # custom cloning methods
72
- def initialize_copy(other)
73
- super
74
- @delegated_to_object = @delegated_to_object.clone
75
- end
82
+ alias :old_respond_to? :respond_to?
83
+ def respond_to?(method)
84
+ delegated_instance_methods.include?(method) || old_respond_to?(method)
85
+ end
76
86
 
77
- private
87
+ alias :old_methods :methods
88
+ def methods
89
+ delegated_instance_methods + old_methods
90
+ end
78
91
 
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"
92
+ def delegated_instance_methods
93
+ PhotoSearch.delegated_instance_methods + delegated_array_accessor_methods
84
94
  end
95
+
96
+
97
+ # custom cloning methods
98
+ def initialize_copy(other)
99
+ super
100
+ @delegated_to_object = @delegated_to_object.clone
101
+ end
102
+
103
+ private
104
+
105
+ def delegated_to_object=(data)
106
+ @delegated_to_object = case data
107
+ when FlickRaw::ResponseList then Photos.new(data)
108
+ when Photos then data
109
+ else raise ArgumentError, "expecting object of class Photos or FlickRaw::ResponseList"
110
+ end
85
111
 
86
- end
112
+ end
87
113
 
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
114
+ def search_terms=(terms=nil)
115
+ terms ||= ''
116
+ raise ArgumentError, "Expecting String but got #{terms.class}" unless terms.is_a?(String)
117
+ @search_terms = terms
118
+ end
93
119
 
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
120
+ def page=(page=nil)
121
+ page ||= default(:page)
122
+ raise ArgumentError, "Expecting Fixnum but got #{page.class}" unless page.is_a?(Fixnum) or page.is_a?(String)
123
+ @page = page.to_i
124
+ end
99
125
 
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
126
+ def date=(date=nil)
127
+ raise ArgumentError, "Expecting String but got #{date.class}" unless date.is_a?(String) or date.nil?
128
+ begin
129
+ Chronic.parse(date) unless date.nil?
130
+ rescue
131
+ raise ArgumentError, "#{date} string can not be converted to Time object"
132
+ end
133
+ @date = date
134
+ end
109
135
 
110
- def delegated_array_accessor_methods
111
- FlickrMocks::Models::Helpers.array_accessor_methods
112
- end
136
+ def delegated_array_accessor_methods
137
+ FlickrMocks::Models::Helpers.array_accessor_methods
138
+ end
113
139
 
140
+ end
114
141
  end
115
142
  end
@@ -1,60 +1,61 @@
1
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
2
+ module Models
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
58
59
  end
59
60
  end
60
61
  end