readypulse 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 98ce8b39ef5d2c2a6deb2fb2d2de1f78b9887b87
4
+ data.tar.gz: d0af05db892f0386c4bde350ecd6553f0b8a34ff
5
+ SHA512:
6
+ metadata.gz: 2b10a928c2b8db0fb1f5448ad8798ee0249699fed46f5e40266ff6e0359d2ae08cd34acdeabd97801ed65fc70c983fbc749146a97ece788c934d605e98b7ac6d
7
+ data.tar.gz: 2936381a3aae7e0c7bc5fff1be2b8a8082764e3f92a2c9f308a66cab849c75332283836d110843c660aebf61b31b438e83ae37f9ef7c9b29fb42dd1c1afd415c
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-head
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in readypulse.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Chad Metcalf
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Chad Metcalf
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Readypulse
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'readypulse'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install readypulse
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/readypulse/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,296 @@
1
+ ```json
2
+ {
3
+ "type":"object",
4
+ "$schema": "http://json-schema.org/draft-03/schema",
5
+ "id": "http://jsonschema.net",
6
+ "required":false,
7
+ "properties":{
8
+ "brand": {
9
+ "type":"object",
10
+ "description": "Details of the brand that this collection is a part of.",
11
+ "id": "http://jsonschema.net/brand",
12
+ "required":true,
13
+ "properties":{
14
+ "id": {
15
+ "type":"number",
16
+ "id": "http://jsonschema.net/brand/id",
17
+ "required":false
18
+ },
19
+ "name": {
20
+ "type":"string",
21
+ "id": "http://jsonschema.net/brand/name",
22
+ "required":false
23
+ }
24
+ }
25
+ },
26
+ "content": {
27
+ "type":"array",
28
+ "description": "An Array of social posts or content.",
29
+ "id": "http://jsonschema.net/content",
30
+ "required":true,
31
+ "items":
32
+ {
33
+ "type":"object",
34
+ "id": "http://jsonschema.net/content/0",
35
+ "required":false,
36
+ "properties":{
37
+ "actor": {
38
+ "type":"object",
39
+ "description": "Details about the content creator",
40
+ "id": "http://jsonschema.net/content/0/actor",
41
+ "required":true,
42
+ "properties":{
43
+ "bio": {
44
+ "type":"null",
45
+ "id": "http://jsonschema.net/content/0/actor/bio",
46
+ "required":false
47
+ },
48
+ "handle_name": {
49
+ "type":"string",
50
+ "id": "http://jsonschema.net/content/0/actor/handle_name",
51
+ "required":false
52
+ },
53
+ "image_url": {
54
+ "type":"string",
55
+ "id": "http://jsonschema.net/content/0/actor/image_url",
56
+ "required":false
57
+ },
58
+ "name": {
59
+ "type":"string",
60
+ "id": "http://jsonschema.net/content/0/actor/name",
61
+ "required":false
62
+ },
63
+ "social_id": {
64
+ "type":"string",
65
+ "id": "http://jsonschema.net/content/0/actor/social_id",
66
+ "required":false
67
+ },
68
+ "url": {
69
+ "type":"string",
70
+ "id": "http://jsonschema.net/content/0/actor/url",
71
+ "required":false
72
+ }
73
+ }
74
+ },
75
+ "content_index": {
76
+ "type":"string",
77
+ "description": "The index in which the content is stored",
78
+ "id": "http://jsonschema.net/content/0/content_index",
79
+ "required":true
80
+ },
81
+ "content_source": {
82
+ "type":"string",
83
+ "description": "Source of the content",
84
+ "id": "http://jsonschema.net/content/0/content_source",
85
+ "required":true
86
+ },
87
+ "external_conversation_link": {
88
+ "type":"null",
89
+ "id": "http://jsonschema.net/content/0/external_conversation_link",
90
+ "required":false
91
+ },
92
+ "has_media": {
93
+ "type":"boolean",
94
+ "id": "http://jsonschema.net/content/0/has_media",
95
+ "required":false
96
+ },
97
+ "media": {
98
+ "type":"object",
99
+ "id": "http://jsonschema.net/content/0/media",
100
+ "required":false,
101
+ "properties":{
102
+ "images": {
103
+ "type":"array",
104
+ "id": "http://jsonschema.net/content/0/media/images",
105
+ "required":false,
106
+ "items":
107
+ {
108
+ "type":"object",
109
+ "id": "http://jsonschema.net/content/0/media/images/0",
110
+ "required":false,
111
+ "properties":{
112
+ "height": {
113
+ "type":"number",
114
+ "id": "http://jsonschema.net/content/0/media/images/0/height",
115
+ "required":false
116
+ },
117
+ "type": {
118
+ "type":"string",
119
+ "id": "http://jsonschema.net/content/0/media/images/0/type",
120
+ "required":false
121
+ },
122
+ "url": {
123
+ "type":"string",
124
+ "id": "http://jsonschema.net/content/0/media/images/0/url",
125
+ "required":false
126
+ },
127
+ "width": {
128
+ "type":"number",
129
+ "id": "http://jsonschema.net/content/0/media/images/0/width",
130
+ "required":false
131
+ }
132
+ }
133
+ }
134
+
135
+
136
+ }
137
+ }
138
+ },
139
+ "products": {
140
+ "type":"array",
141
+ "description": "List of Products associated with this content. Products are part of the eCommerce catalog that the brand has configured with ReadyPulse",
142
+ "id": "http://jsonschema.net/content/0/products",
143
+ "required":false,
144
+ "items":
145
+ {
146
+ "type":"object",
147
+ "id": "http://jsonschema.net/content/0/products/0",
148
+ "required":false,
149
+ "properties":{
150
+ "description": {
151
+ "type":"string",
152
+ "id": "http://jsonschema.net/content/0/products/0/description",
153
+ "required":false
154
+ },
155
+ "image": {
156
+ "type":"string",
157
+ "id": "http://jsonschema.net/content/0/products/0/image",
158
+ "required":false
159
+ },
160
+ "name": {
161
+ "type":"string",
162
+ "id": "http://jsonschema.net/content/0/products/0/name",
163
+ "required":false
164
+ },
165
+ "price": {
166
+ "type":"string",
167
+ "id": "http://jsonschema.net/content/0/products/0/price",
168
+ "required":false
169
+ },
170
+ "thumbnail_image_url": {
171
+ "type":"null",
172
+ "id": "http://jsonschema.net/content/0/products/0/thumbnail_image_url",
173
+ "required":false
174
+ },
175
+ "tiny_image_url": {
176
+ "type":"null",
177
+ "id": "http://jsonschema.net/content/0/products/0/tiny_image_url",
178
+ "required":false
179
+ },
180
+ "url": {
181
+ "type":"string",
182
+ "id": "http://jsonschema.net/content/0/products/0/url",
183
+ "required":false
184
+ }
185
+ }
186
+ }
187
+ },
188
+ "readypulse_content_score": {
189
+ "type":"number",
190
+ "id": "http://jsonschema.net/content/0/readypulse_content_score",
191
+ "required":false
192
+ },
193
+ "sentiment": {
194
+ "type":"string",
195
+ "id": "http://jsonschema.net/content/0/sentiment",
196
+ "required":false
197
+ },
198
+ "social_attributes": {
199
+ "type":"object",
200
+ "id": "http://jsonschema.net/content/0/social_attributes",
201
+ "required":false
202
+ },
203
+ "story_url": {
204
+ "type":"string",
205
+ "id": "http://jsonschema.net/content/0/story_url",
206
+ "required":false
207
+ },
208
+ "timestamp": {
209
+ "type":"string",
210
+ "id": "http://jsonschema.net/content/0/timestamp",
211
+ "required":false
212
+ },
213
+ "type": {
214
+ "type":"string",
215
+ "id": "http://jsonschema.net/content/0/type",
216
+ "required":false
217
+ },
218
+ "uniq_id": {
219
+ "type":"string",
220
+ "description": "The unique content ID within ReadyPulse indexes",
221
+ "id": "http://jsonschema.net/content/0/uniq_id",
222
+ "required":true
223
+ },
224
+ "id": {
225
+ "type":"string",
226
+ "description": "The unique content ID within ReadyPulse indexes. To be used with all ReadyPulse API calls.",
227
+ "id": "http://jsonschema.net/content/0/id",
228
+ "required":true
229
+ },
230
+ "user_text": {
231
+ "type":"string",
232
+ "id": "http://jsonschema.net/content/0/user_text",
233
+ "required":false
234
+ }
235
+ }
236
+ }
237
+
238
+
239
+ },
240
+ "created_at": {
241
+ "type":"string",
242
+ "id": "http://jsonschema.net/created_at",
243
+ "required":false
244
+ },
245
+ "description": {
246
+ "type":"string",
247
+ "id": "http://jsonschema.net/description",
248
+ "required":false
249
+ },
250
+ "id": {
251
+ "type":"number",
252
+ "description": "ID of the collection",
253
+ "id": "http://jsonschema.net/id",
254
+ "required":true
255
+ },
256
+ "item_count": {
257
+ "type":"number",
258
+ "description": "Number of items in the collection",
259
+ "id": "http://jsonschema.net/item_count",
260
+ "required":true
261
+ },
262
+ "name": {
263
+ "type":"string",
264
+ "id": "http://jsonschema.net/name",
265
+ "required":false
266
+ },
267
+ "readypulse_user": {
268
+ "type":"object",
269
+ "id": "http://jsonschema.net/readypulse_user",
270
+ "required":false,
271
+ "properties":{
272
+ "id": {
273
+ "type":"number",
274
+ "id": "http://jsonschema.net/readypulse_user/id",
275
+ "required":false
276
+ },
277
+ "name": {
278
+ "type":"string",
279
+ "id": "http://jsonschema.net/readypulse_user/name",
280
+ "required":false
281
+ }
282
+ }
283
+ },
284
+ "type": {
285
+ "type":"string",
286
+ "id": "http://jsonschema.net/type",
287
+ "required":false
288
+ },
289
+ "updated_at": {
290
+ "type":"string",
291
+ "id": "http://jsonschema.net/updated_at",
292
+ "required":false
293
+ }
294
+ }
295
+ }
296
+ ```
data/lib/readypulse.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "readypulse/version"
2
+
3
+ require "readypulse/client"
4
+ require "readypulse/album"
5
+ require "readypulse/image"
6
+ require "readypulse/image_type"
7
+ require "readypulse/image_collection"
8
+
9
+ module Readypulse
10
+ end
@@ -0,0 +1,30 @@
1
+ module Readypulse
2
+ class Album
3
+
4
+ ATTR_FIELDS = %w(created_at description item_count name readypulse_user type
5
+ updated_at)
6
+
7
+ attr_accessor :id, :brand, :content, :description, :item_count, :name,
8
+ :readypulse_user, :type, :created_at, :updated_at
9
+
10
+ def initialize(id:)
11
+ @id = id
12
+ ATTR_FIELDS.each do |attr_field|
13
+ instance_variable_set( "@" + attr_field, get_album[attr_field.to_sym])
14
+ end
15
+ end
16
+
17
+ def images
18
+ @images ||= ImageCollection.new(album_id: id)
19
+ end
20
+
21
+ private
22
+ def get_album
23
+ from_client
24
+ end
25
+
26
+ def from_client
27
+ Client.instance.to_album(album_id: id)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,72 @@
1
+ module Readypulse
2
+ require 'json'
3
+
4
+ class Client
5
+ def self.instance
6
+ @@client ||= Client.new
7
+ end
8
+
9
+ attr_accessor :album_id
10
+
11
+ def initialize
12
+ end
13
+
14
+ def to_album(album_id: @album_id)
15
+ validate_album_id(album_id)
16
+ parsed_album_response
17
+ end
18
+
19
+ def to_images(album_id: @album_id)
20
+ validate_album_id(album_id)
21
+ parsed_response_content
22
+ # parsed_response_content.first
23
+ end
24
+
25
+ private
26
+
27
+ def validate_album_id(album_id)
28
+ unless album_id.is_a?(Fixnum)
29
+ fail ArgumentError.new("Incorrect album_id value: #{album_id.inspect}")
30
+ end
31
+
32
+ reset_response! if album_id_changed?(album_id)
33
+ end
34
+
35
+ def album_id_changed?(album_id)
36
+ changed = (@album_id == album_id)
37
+ @album_id = album_id
38
+ return changed
39
+ end
40
+
41
+ def reset_response!
42
+ @response = nil
43
+ end
44
+
45
+ def parsed_album_response
46
+ parsed_response.tap{|hash| hash.delete(:content)}
47
+ end
48
+
49
+ def parsed_response_content
50
+ parsed_response[:content]
51
+ end
52
+
53
+ def parsed_response
54
+ JSON.parse(response,:symbolize_names => true)
55
+ end
56
+
57
+ def response
58
+ @response || response!
59
+ end
60
+
61
+ def response!
62
+ @response = Net::HTTP.get(uri)
63
+ # TODO: What is the right error message here?
64
+ fail TimeoutError.new if @response.empty? || @response.nil?
65
+ @response
66
+ end
67
+
68
+ def uri
69
+ URI("http://widgets.readypulse.com/api/v1/widgets/#{album_id}.json")
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,72 @@
1
+ module Readypulse
2
+ class Image < Hash
3
+
4
+ # # Public: Container for ImageType objects.
5
+ #
6
+ # raw_image - raw image information from Readypulse API
7
+ #
8
+ # Examples
9
+ #
10
+ # image = Image.new(raw_image: {:id=>"4::instagram::instagram_012014",
11
+ # :uniq_id=>"3542844_630741923525326235_3542844",
12
+ # :external_network_id=>"630741923525326235_3542844",
13
+ # :content_source=>"instagram",
14
+ # :content_index=>"instagram_012014",
15
+ # :type=>"photo",
16
+ # :has_media=>true,
17
+ # :story_url=>"http://instagram.com/p/jA2HAIrHWb/",
18
+ # :external_conversation_link=>"http://instagram.com/p/jA2HAIrHWb/",
19
+ # :user_text=>"Smoke em if you got em #kr3wkills",
20
+ # :timestamp=>"2014-01-11T03:18:38Z",
21
+ # :social_timestamp=>"January 11, 2014",
22
+ # :social_attributes=>{:Likes=>1220, :Comments=>7},
23
+ # :readypulse_content_score=>44.13,
24
+ # :sentiment=>"neutral",
25
+ # :is_consented=>false,
26
+ # :is_incentivized=>false,
27
+ # :is_compliant=>nil,
28
+ # :is_approved=>nil,
29
+ # :cta=>nil,
30
+ # :media=>{:images=>[{:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>220, :height=>150},
31
+ # {:type=>"tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>250},
32
+ # {:type=>"square-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>300},
33
+ # {:type=>"mobile-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>250},
34
+ # {:type=>"large", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>550, :height=>550},
35
+ # {:type=>"original", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>640, :height=>640}]},
36
+ # :actor=>{:social_id=>"3542844",
37
+ # :handle_name=>"kr3wdenim",
38
+ # :name=>"KR3W Denim",
39
+ # :bio=>"#rightsrefused #no11 #rehabdenim #kr3wkills",
40
+ # :image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_3542844.jpg",
41
+ # :url=>"http://www.instagram.com/kr3wdenim"},
42
+ # :products=>[{:id=>"4850_google_store_k5131408",
43
+ # :catalog_id=>"k5131408",
44
+ # :name=>"SKELETON KR3W",
45
+ # :description=>nil, :price=>"28.0",
46
+ # :url=>"http://kr3wdenim.com/products/k5131408",
47
+ # :image=>"https://s7d9.scene7.com/is/image/onedist/SKELETONKR3W_K5131408_BLK_Back?$ecomm_detail_main$",
48
+ # :thumbnail_image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_200,w_200/wn2eye3ztervwcuhqbzr.jpg",
49
+ # :tiny_image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_50,w_50/wn2eye3ztervwcuhqbzr.jpg"}]
50
+ # }
51
+ #
52
+ #
53
+ # image['email'] => #<ImageType @type="email" @url="http://example.com/4.jpg">
54
+ #
55
+ # returns an Image object with ImageType objects at the root too
56
+
57
+ attr_accessor :readypulse_content_score
58
+
59
+ def initialize(raw_image:)
60
+ @readypulse_content_score = raw_image[:readypulse_content_score]
61
+
62
+
63
+ raw_image.fetch(:media, {}).fetch(:images, []).each do |raw_type|
64
+ self.store(raw_type[:type], ImageType.new(raw_type: raw_type))
65
+ end
66
+ end
67
+
68
+ def types
69
+ self.keys
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,35 @@
1
+ module Readypulse
2
+ class ImageCollection
3
+
4
+ include Enumerable
5
+ attr_accessor :images, :album_id
6
+
7
+ def initialize(album_id:)
8
+ @album_id = album_id
9
+ end
10
+
11
+ def each(&block)
12
+ images.each(&block)
13
+ end
14
+
15
+ def all
16
+ images
17
+ end
18
+
19
+ def images
20
+ @images ||= get_images
21
+ end
22
+
23
+ private
24
+
25
+ def get_images
26
+ from_client.map do |raw_image|
27
+ Image.new(raw_image: raw_image)
28
+ end
29
+ end
30
+
31
+ def from_client
32
+ Client.instance.to_images(album_id: album_id)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ module Readypulse
2
+ class ImageType
3
+
4
+ attr_accessor :type, :url, :width, :height
5
+ def initialize(raw_type:)
6
+ %w(type url width height).each do |attribute|
7
+ instance_variable_set( "@" + attribute, raw_type.fetch(attribute.to_sym))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Readypulse
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'readypulse/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'readypulse'
8
+ spec.version = Readypulse::VERSION
9
+ spec.authors = ['Chad Metcalf']
10
+ spec.email = ['cmetcalf@nerdery.com']
11
+ spec.summary = %q{Readypulse API wrapper.}
12
+ spec.description = %q{Readypulse API wrapper.}
13
+ spec.homepage = ''
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.7'
22
+ spec.add_development_dependency 'rake', '~> 10.0'
23
+ spec.add_development_dependency 'rspec', '~> 3.0'
24
+ spec.add_development_dependency 'rspec-its'
25
+ spec.add_development_dependency 'rspec-collection_matchers'
26
+ spec.add_development_dependency 'guard-rspec'
27
+ end
@@ -0,0 +1,43 @@
1
+ module Readypulse
2
+ RSpec.describe Album do
3
+ let(:album_id) {1}
4
+ subject(:album) {Album.new(id: album_id)}
5
+
6
+ before(:each) do
7
+ client = double(Client)
8
+ allow(Client).to receive(:instance).and_return(client)
9
+ allow(client).to receive(:to_album).and_return(from_client)
10
+ end
11
+
12
+ context '.new' do
13
+ it 'requires an id value' do
14
+ no_id_album = ->{Album.new}
15
+
16
+ expect{no_id_album.call}.to raise_error
17
+ end
18
+
19
+ it 'is successful' do
20
+ expect(album).to be_an(Album)
21
+ end
22
+ end
23
+
24
+ its(:id) { is_expected.to eq(from_client[:id]) }
25
+ its(:description) { is_expected.to eq(from_client[:description]) }
26
+ its(:item_count) { is_expected.to eq(from_client[:item_count]) }
27
+ its(:name) { is_expected.to eq(from_client[:name]) }
28
+ its(:type) { is_expected.to eq(from_client[:type]) }
29
+ its(:readypulse_user) { is_expected.to eq(from_client[:readypulse_user]) }
30
+ its(:created_at) { is_expected.to eq(from_client[:created_at]) }
31
+ its(:updated_at) { is_expected.to eq(from_client[:updated_at]) }
32
+
33
+ it '#images' do
34
+ allow(ImageCollection).to receive(:new).with(album_id: album_id)
35
+ album.images
36
+ expect(ImageCollection).to have_received(:new)
37
+ end
38
+
39
+ def from_client
40
+ {:id=>1, :name=>"My Very First Curation", :description=>"This is my first curation on the ReadyPulse production site.", :type=>"static", :created_at=>"2012-04-09T09:35:07Z", :updated_at=>"2015-01-21T17:10:57Z", :brand=>{:id=>162, :name=>"Metal Mulisha"}, :readypulse_user=>{:id=>1, :name=>"Mihir Vaidya"}, :item_count=>3}
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,45 @@
1
+ module Readypulse
2
+ RSpec.describe Client do
3
+ subject(:client) {Client.instance}
4
+ let(:album_id) {1}
5
+
6
+ before(:each) do
7
+ allow(Net::HTTP).to receive(:get).
8
+ with(URI("http://widgets.readypulse.com/api/v1/widgets/#{album_id}.json")).
9
+ and_return(readypulse_response)
10
+ end
11
+
12
+ it '.instance is a singleton' do
13
+ additional_client = Client.instance
14
+
15
+ expect(additional_client).to be(client)
16
+ end
17
+
18
+ it 'when album_id changes, a new request is made' do
19
+ skip("This feature is low priority, come back around if you get a chance")
20
+ expect(client).to receive(:response!).twice
21
+ client.to_album(album_id: album_id)
22
+ client.to_album(album_id: album_id)
23
+ end
24
+
25
+ it '#to_album' do
26
+ expect(client.to_album(album_id: album_id)).to eq(from_client_to_album)
27
+ end
28
+
29
+ it '#to_images' do
30
+ expect(client.to_images(album_id: album_id)).to eq(from_client_to_image)
31
+ end
32
+
33
+ def from_client_to_album
34
+ {:id=>1, :name=>"My Very First Curation", :description=>"This is my first curation on the ReadyPulse production site.", :type=>"static", :created_at=>"2012-04-09T09:35:07Z", :updated_at=>"2015-01-21T17:10:57Z", :brand=>{:id=>162, :name=>"Metal Mulisha"}, :readypulse_user=>{:id=>1, :name=>"Mihir Vaidya"}, :item_count=>3}
35
+ end
36
+
37
+ def from_client_to_image
38
+ [{:id=>"3542844_630741923525326235_3542844::instagram::instagram_012014", :uniq_id=>"3542844_630741923525326235_3542844", :external_network_id=>"630741923525326235_3542844", :content_source=>"instagram", :content_index=>"instagram_012014", :type=>"photo", :has_media=>true, :story_url=>"http://instagram.com/p/jA2HAIrHWb/", :external_conversation_link=>"http://instagram.com/p/jA2HAIrHWb/", :user_text=>"Smoke em if you got em #kr3wkills", :timestamp=>"2014-01-11T03:18:38Z", :social_timestamp=>"January 11, 2014", :social_attributes=>{:Likes=>1220, :Comments=>7}, :readypulse_content_score=>44.13, :sentiment=>"neutral", :is_consented=>false, :is_incentivized=>false, :is_compliant=>nil, :is_approved=>nil, :cta=>nil, :media=>{:images=>[{:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>220, :height=>150}, {:type=>"tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>250}, {:type=>"square-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>300}, {:type=>"mobile-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>250}, {:type=>"large", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>550, :height=>550}, {:type=>"original", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>640, :height=>640}]}, :actor=>{:social_id=>"3542844", :handle_name=>"kr3wdenim", :name=>"KR3W Denim", :bio=>"#rightsrefused #no11 #rehabdenim #kr3wkills", :image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_3542844.jpg", :url=>"http://www.instagram.com/kr3wdenim"}, :products=>[{:id=>"4850_google_store_k5131408", :catalog_id=>"k5131408", :name=>"SKELETON KR3W", :description=>nil, :price=>"28.0", :url=>"http://kr3wdenim.com/products/k5131408", :image=>"https://s7d9.scene7.com/is/image/onedist/SKELETONKR3W_K5131408_BLK_Back?$ecomm_detail_main$", :thumbnail_image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_200,w_200/wn2eye3ztervwcuhqbzr.jpg", :tiny_image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_50,w_50/wn2eye3ztervwcuhqbzr.jpg"}]}, {:id=>"reebokoneseries_636365886051018888_840944057::instagram::instagram_012014", :uniq_id=>"reebokoneseries_636365886051018888_840944057", :external_network_id=>"636365886051018888_840944057", :content_source=>"instagram", :content_index=>"instagram_012014", :type=>"photo", :has_media=>true, :story_url=>"https://instagram.com/p/jU02bZP2iI/", :external_conversation_link=>"https://instagram.com/p/jU02bZP2iI/", :user_text=>"We did shine! \n#ReebokOneSeries #lightedlaces #Vondelpark #running", :timestamp=>"2014-01-18T21:32:26Z", :social_timestamp=>"January 18, 2014", :social_attributes=>{:Likes=>7}, :readypulse_content_score=>53.23, :sentiment=>"positive", :is_consented=>false, :is_incentivized=>false, :is_compliant=>nil, :is_approved=>true, :cta=>nil, :media=>{:images=>[{:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>220, :height=>150}, {:type=>"tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>300, :height=>250}, {:type=>"square-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>300, :height=>300}, {:type=>"mobile-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>300, :height=>250}, {:type=>"large", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>550, :height=>550}, {:type=>"original", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>640, :height=>640}]}, :actor=>{:social_id=>"840944057", :handle_name=>"jessyhoutman", :name=>"Jessy", :bio=>"Marketing Manager adidas Group Benelux Amsterdam", :image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_840944057.jpg", :url=>"http://www.instagram.com/jessyhoutman"}}, {:id=>"bestfootforward13_605863231064875273_4806511::instagram::instagram_122013", :uniq_id=>"bestfootforward13_605863231064875273_4806511", :external_network_id=>"605863231064875273_4806511", :content_source=>"instagram", :content_index=>"instagram_122013", :type=>"photo", :has_media=>true, :story_url=>"http://instagram.com/p/hodWYOF6EJ/", :external_conversation_link=>"http://instagram.com/p/hodWYOF6EJ/", :user_text=>"#bestfootforward13 Houston winner Ryan Thompson today at #tampaam @spottampa", :timestamp=>"2013-12-07T19:30:06Z", :social_timestamp=>"December 07, 2013", :social_attributes=>{:Likes=>4307, :Comments=>9}, :readypulse_content_score=>37.98, :sentiment=>"neutral", :is_consented=>false, :is_incentivized=>false, :is_compliant=>nil, :is_approved=>true, :cta=>nil, :media=>{:images=>[{:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>220, :height=>150}, {:type=>"tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>300, :height=>250}, {:type=>"square-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>300, :height=>300}, {:type=>"mobile-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>300, :height=>250}, {:type=>"large", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>550, :height=>550}, {:type=>"original", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>640, :height=>640}]}, :actor=>{:social_id=>"4806511", :handle_name=>"zumiez", :name=>"zumiez", :bio=>"Since 1978 Zumiez has been a leading retailer of action sports clothing, and accessories providing a unique selection of brands in each of our stores", :image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_4806511.jpg", :url=>"http://www.instagram.com/zumiez"}}]
39
+ end
40
+
41
+ def readypulse_response
42
+ "{\"id\":1,\"name\":\"My Very First Curation\",\"description\":\"This is my first curation on the ReadyPulse production site.\",\"type\":\"static\",\"created_at\":\"2012-04-09T09:35:07Z\",\"updated_at\":\"2015-01-21T17:10:57Z\",\"brand\":{\"id\":162,\"name\":\"Metal Mulisha\"},\"readypulse_user\":{\"id\":1,\"name\":\"Mihir Vaidya\"},\"item_count\":3,\"content\":[{\"id\":\"3542844_630741923525326235_3542844::instagram::instagram_012014\",\"uniq_id\":\"3542844_630741923525326235_3542844\",\"external_network_id\":\"630741923525326235_3542844\",\"content_source\":\"instagram\",\"content_index\":\"instagram_012014\",\"type\":\"photo\",\"has_media\":true,\"story_url\":\"http://instagram.com/p/jA2HAIrHWb/\",\"external_conversation_link\":\"http://instagram.com/p/jA2HAIrHWb/\",\"user_text\":\"Smoke em if you got em #kr3wkills\",\"timestamp\":\"2014-01-11T03:18:38Z\",\"social_timestamp\":\"January 11, 2014\",\"social_attributes\":{\"Likes\":1220,\"Comments\":7},\"readypulse_content_score\":44.13,\"sentiment\":\"neutral\",\"is_consented\":false,\"is_incentivized\":false,\"is_compliant\":null,\"is_approved\":null,\"cta\":null,\"media\":{\"images\":[{\"type\":\"email\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1418764365/ig_3542844_630741923525326235_3542844.jpg\",\"width\":220,\"height\":150},{\"type\":\"tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg\",\"width\":300,\"height\":250},{\"type\":\"square-tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg\",\"width\":300,\"height\":300},{\"type\":\"mobile-tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg\",\"width\":300,\"height\":250},{\"type\":\"large\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1418764365/ig_3542844_630741923525326235_3542844.jpg\",\"width\":550,\"height\":550},{\"type\":\"original\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1418764365/ig_3542844_630741923525326235_3542844.jpg\",\"width\":640,\"height\":640}]},\"actor\":{\"social_id\":\"3542844\",\"handle_name\":\"kr3wdenim\",\"name\":\"KR3W Denim\",\"bio\":\"#rightsrefused #no11 #rehabdenim #kr3wkills\",\"image_url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_3542844.jpg\",\"url\":\"http://www.instagram.com/kr3wdenim\"},\"products\":[{\"id\":\"4850_google_store_k5131408\",\"catalog_id\":\"k5131408\",\"name\":\"SKELETON KR3W\",\"description\":null,\"price\":\"28.0\",\"url\":\"http://kr3wdenim.com/products/k5131408\",\"image\":\"https://s7d9.scene7.com/is/image/onedist/SKELETONKR3W_K5131408_BLK_Back?$ecomm_detail_main$\",\"thumbnail_image_url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_200,w_200/wn2eye3ztervwcuhqbzr.jpg\",\"tiny_image_url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_50,w_50/wn2eye3ztervwcuhqbzr.jpg\"}]},{\"id\":\"reebokoneseries_636365886051018888_840944057::instagram::instagram_012014\",\"uniq_id\":\"reebokoneseries_636365886051018888_840944057\",\"external_network_id\":\"636365886051018888_840944057\",\"content_source\":\"instagram\",\"content_index\":\"instagram_012014\",\"type\":\"photo\",\"has_media\":true,\"story_url\":\"https://instagram.com/p/jU02bZP2iI/\",\"external_conversation_link\":\"https://instagram.com/p/jU02bZP2iI/\",\"user_text\":\"We did shine! \\n#ReebokOneSeries #lightedlaces #Vondelpark #running\",\"timestamp\":\"2014-01-18T21:32:26Z\",\"social_timestamp\":\"January 18, 2014\",\"social_attributes\":{\"Likes\":7},\"readypulse_content_score\":53.23,\"sentiment\":\"positive\",\"is_consented\":false,\"is_incentivized\":false,\"is_compliant\":null,\"is_approved\":true,\"cta\":null,\"media\":{\"images\":[{\"type\":\"email\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg\",\"width\":220,\"height\":150},{\"type\":\"tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg\",\"width\":300,\"height\":250},{\"type\":\"square-tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg\",\"width\":300,\"height\":300},{\"type\":\"mobile-tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg\",\"width\":300,\"height\":250},{\"type\":\"large\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg\",\"width\":550,\"height\":550},{\"type\":\"original\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg\",\"width\":640,\"height\":640}]},\"actor\":{\"social_id\":\"840944057\",\"handle_name\":\"jessyhoutman\",\"name\":\"Jessy\",\"bio\":\"Marketing Manager adidas Group Benelux Amsterdam\",\"image_url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_840944057.jpg\",\"url\":\"http://www.instagram.com/jessyhoutman\"}},{\"id\":\"bestfootforward13_605863231064875273_4806511::instagram::instagram_122013\",\"uniq_id\":\"bestfootforward13_605863231064875273_4806511\",\"external_network_id\":\"605863231064875273_4806511\",\"content_source\":\"instagram\",\"content_index\":\"instagram_122013\",\"type\":\"photo\",\"has_media\":true,\"story_url\":\"http://instagram.com/p/hodWYOF6EJ/\",\"external_conversation_link\":\"http://instagram.com/p/hodWYOF6EJ/\",\"user_text\":\"#bestfootforward13 Houston winner Ryan Thompson today at #tampaam @spottampa\",\"timestamp\":\"2013-12-07T19:30:06Z\",\"social_timestamp\":\"December 07, 2013\",\"social_attributes\":{\"Likes\":4307,\"Comments\":9},\"readypulse_content_score\":37.98,\"sentiment\":\"neutral\",\"is_consented\":false,\"is_incentivized\":false,\"is_compliant\":null,\"is_approved\":true,\"cta\":null,\"media\":{\"images\":[{\"type\":\"email\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg\",\"width\":220,\"height\":150},{\"type\":\"tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg\",\"width\":300,\"height\":250},{\"type\":\"square-tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg\",\"width\":300,\"height\":300},{\"type\":\"mobile-tile\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg\",\"width\":300,\"height\":250},{\"type\":\"large\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg\",\"width\":550,\"height\":550},{\"type\":\"original\",\"url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg\",\"width\":640,\"height\":640}]},\"actor\":{\"social_id\":\"4806511\",\"handle_name\":\"zumiez\",\"name\":\"zumiez\",\"bio\":\"Since 1978 Zumiez has been a leading retailer of action sports clothing, and accessories providing a unique selection of brands in each of our stores\",\"image_url\":\"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_4806511.jpg\",\"url\":\"http://www.instagram.com/zumiez\"}}]}"
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,24 @@
1
+ module Readypulse
2
+ RSpec.describe ImageCollection do
3
+ let(:album_id) {1}
4
+ subject(:image_collection) {ImageCollection.new(album_id: album_id)}
5
+
6
+ before(:each) do
7
+ client = double(Client)
8
+ allow(Client).to receive(:instance).and_return(client)
9
+ allow(client).to receive(:to_images).and_return(from_client)
10
+
11
+ image = double(Image)
12
+ allow(Image).to receive(:new).and_return(image)
13
+ end
14
+
15
+ it 'has image_type objects' do
16
+ expect(image_collection).to have(3).images
17
+ end
18
+
19
+
20
+ def from_client
21
+ [{:id=>"3542844_630741923525326235_3542844::instagram::instagram_012014", :uniq_id=>"3542844_630741923525326235_3542844", :external_network_id=>"630741923525326235_3542844", :content_source=>"instagram", :content_index=>"instagram_012014", :type=>"photo", :has_media=>true, :story_url=>"http://instagram.com/p/jA2HAIrHWb/", :external_conversation_link=>"http://instagram.com/p/jA2HAIrHWb/", :user_text=>"Smoke em if you got em #kr3wkills", :timestamp=>"2014-01-11T03:18:38Z", :social_timestamp=>"January 11, 2014", :social_attributes=>{:Likes=>1220, :Comments=>7}, :readypulse_content_score=>44.13, :sentiment=>"neutral", :is_consented=>false, :is_incentivized=>false, :is_compliant=>nil, :is_approved=>nil, :cta=>nil, :media=>{:images=>[{:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>220, :height=>150}, {:type=>"tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>250}, {:type=>"square-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>300}, {:type=>"mobile-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>250}, {:type=>"large", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>550, :height=>550}, {:type=>"original", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>640, :height=>640}]}, :actor=>{:social_id=>"3542844", :handle_name=>"kr3wdenim", :name=>"KR3W Denim", :bio=>"#rightsrefused #no11 #rehabdenim #kr3wkills", :image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_3542844.jpg", :url=>"http://www.instagram.com/kr3wdenim"}, :products=>[{:id=>"4850_google_store_k5131408", :catalog_id=>"k5131408", :name=>"SKELETON KR3W", :description=>nil, :price=>"28.0", :url=>"http://kr3wdenim.com/products/k5131408", :image=>"https://s7d9.scene7.com/is/image/onedist/SKELETONKR3W_K5131408_BLK_Back?$ecomm_detail_main$", :thumbnail_image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_200,w_200/wn2eye3ztervwcuhqbzr.jpg", :tiny_image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_50,w_50/wn2eye3ztervwcuhqbzr.jpg"}]}, {:id=>"reebokoneseries_636365886051018888_840944057::instagram::instagram_012014", :uniq_id=>"reebokoneseries_636365886051018888_840944057", :external_network_id=>"636365886051018888_840944057", :content_source=>"instagram", :content_index=>"instagram_012014", :type=>"photo", :has_media=>true, :story_url=>"https://instagram.com/p/jU02bZP2iI/", :external_conversation_link=>"https://instagram.com/p/jU02bZP2iI/", :user_text=>"We did shine! \n#ReebokOneSeries #lightedlaces #Vondelpark #running", :timestamp=>"2014-01-18T21:32:26Z", :social_timestamp=>"January 18, 2014", :social_attributes=>{:Likes=>7}, :readypulse_content_score=>53.23, :sentiment=>"positive", :is_consented=>false, :is_incentivized=>false, :is_compliant=>nil, :is_approved=>true, :cta=>nil, :media=>{:images=>[{:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>220, :height=>150}, {:type=>"tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>300, :height=>250}, {:type=>"square-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>300, :height=>300}, {:type=>"mobile-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>300, :height=>250}, {:type=>"large", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>550, :height=>550}, {:type=>"original", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1401839306/ig_reebokoneseries_636365886051018888_840944057.jpg", :width=>640, :height=>640}]}, :actor=>{:social_id=>"840944057", :handle_name=>"jessyhoutman", :name=>"Jessy", :bio=>"Marketing Manager adidas Group Benelux Amsterdam", :image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_840944057.jpg", :url=>"http://www.instagram.com/jessyhoutman"}}, {:id=>"bestfootforward13_605863231064875273_4806511::instagram::instagram_122013", :uniq_id=>"bestfootforward13_605863231064875273_4806511", :external_network_id=>"605863231064875273_4806511", :content_source=>"instagram", :content_index=>"instagram_122013", :type=>"photo", :has_media=>true, :story_url=>"http://instagram.com/p/hodWYOF6EJ/", :external_conversation_link=>"http://instagram.com/p/hodWYOF6EJ/", :user_text=>"#bestfootforward13 Houston winner Ryan Thompson today at #tampaam @spottampa", :timestamp=>"2013-12-07T19:30:06Z", :social_timestamp=>"December 07, 2013", :social_attributes=>{:Likes=>4307, :Comments=>9}, :readypulse_content_score=>37.98, :sentiment=>"neutral", :is_consented=>false, :is_incentivized=>false, :is_compliant=>nil, :is_approved=>true, :cta=>nil, :media=>{:images=>[{:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>220, :height=>150}, {:type=>"tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>300, :height=>250}, {:type=>"square-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>300, :height=>300}, {:type=>"mobile-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>300, :height=>250}, {:type=>"large", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>550, :height=>550}, {:type=>"original", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1390954685/ig_bestfootforward13_605863231064875273_4806511.jpg", :width=>640, :height=>640}]}, :actor=>{:social_id=>"4806511", :handle_name=>"zumiez", :name=>"zumiez", :bio=>"Since 1978 Zumiez has been a leading retailer of action sports clothing, and accessories providing a unique selection of brands in each of our stores", :image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_4806511.jpg", :url=>"http://www.instagram.com/zumiez"}}]
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ module Readypulse
2
+ RSpec.describe Image do
3
+ subject(:image) {Image.new(raw_image: from_client)}
4
+
5
+ its(:types) {is_expected.to eq(["email", "tile", "square-tile", "mobile-tile", "large", "original"])}
6
+ its(:readypulse_content_score) {is_expected.to eq(from_client[:readypulse_content_score])}
7
+
8
+ it 'has image_type objects' do
9
+ expect(image["email"]).to be_an(ImageType)
10
+ expect(image["tile"]).to be_an(ImageType)
11
+ expect(image["square-tile"]).to be_an(ImageType)
12
+ expect(image["mobile-tile"]).to be_an(ImageType)
13
+ expect(image["large"]).to be_an(ImageType)
14
+ expect(image["original"]).to be_an(ImageType)
15
+ end
16
+
17
+ def from_client
18
+ {:id=>"3542844_630741923525326235_3542844::instagram::instagram_012014", :uniq_id=>"3542844_630741923525326235_3542844", :external_network_id=>"630741923525326235_3542844", :content_source=>"instagram", :content_index=>"instagram_012014", :type=>"photo", :has_media=>true, :story_url=>"http://instagram.com/p/jA2HAIrHWb/", :external_conversation_link=>"http://instagram.com/p/jA2HAIrHWb/", :user_text=>"Smoke em if you got em #kr3wkills", :timestamp=>"2014-01-11T03:18:38Z", :social_timestamp=>"January 11, 2014", :social_attributes=>{:Likes=>1220, :Comments=>7}, :readypulse_content_score=>44.13, :sentiment=>"neutral", :is_consented=>false, :is_incentivized=>false, :is_compliant=>nil, :is_approved=>nil, :cta=>nil, :media=>{:images=>[{:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>220, :height=>150}, {:type=>"tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>250}, {:type=>"square-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_300,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>300}, {:type=>"mobile-tile", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_250,q_75,w_300/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>300, :height=>250}, {:type=>"large", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,h_550,q_90,w_550/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>550, :height=>550}, {:type=>"original", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/b_white,c_pad,fl_progressive,g_center,q_90/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>640, :height=>640}]}, :actor=>{:social_id=>"3542844", :handle_name=>"kr3wdenim", :name=>"KR3W Denim", :bio=>"#rightsrefused #no11 #rehabdenim #kr3wkills", :image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_50,q_75,w_50/ig_3542844.jpg", :url=>"http://www.instagram.com/kr3wdenim"}, :products=>[{:id=>"4850_google_store_k5131408", :catalog_id=>"k5131408", :name=>"SKELETON KR3W", :description=>nil, :price=>"28.0", :url=>"http://kr3wdenim.com/products/k5131408", :image=>"https://s7d9.scene7.com/is/image/onedist/SKELETONKR3W_K5131408_BLK_Back?$ecomm_detail_main$", :thumbnail_image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_200,w_200/wn2eye3ztervwcuhqbzr.jpg", :tiny_image_url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_pad,h_50,w_50/wn2eye3ztervwcuhqbzr.jpg"}]}
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Readypulse
2
+ RSpec.describe ImageType do
3
+ subject(:image_type) {ImageType.new(raw_type: from_client)}
4
+
5
+ its(:type) { is_expected.to eq(from_client[:type]) }
6
+ its(:url) { is_expected.to eq(from_client[:url]) }
7
+ its(:width) { is_expected.to eq(from_client[:width]) }
8
+ its(:height) { is_expected.to eq(from_client[:height]) }
9
+
10
+
11
+ def from_client
12
+ {:type=>"email", :url=>"https://cloudinary-a.akamaihd.net/readypulse/image/upload/c_fill,fl_progressive,h_150,q_75,w_220/v1418764365/ig_3542844_630741923525326235_3542844.jpg", :width=>220, :height=>150}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,97 @@
1
+
2
+ require 'readypulse'
3
+ require 'rspec/its'
4
+ require 'rspec/collection_matchers'
5
+
6
+
7
+ # This file was generated by the `rspec --init` command. Conventionally, all
8
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
9
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
10
+ # this file to always be loaded, without a need to explicitly require it in any
11
+ # files.
12
+ #
13
+ # Given that it is always loaded, you are encouraged to keep this file as
14
+ # light-weight as possible. Requiring heavyweight dependencies from this file
15
+ # will add to the boot time of your test suite on EVERY test run, even for an
16
+ # individual file that may not need all of that loaded. Instead, consider making
17
+ # a separate helper file that requires the additional dependencies and performs
18
+ # the additional setup, and require it from the spec files that actually need
19
+ # it.
20
+ #
21
+ # The `.rspec` file also contains a few flags that are not defaults but that
22
+ # users commonly want.
23
+ #
24
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
25
+ RSpec.configure do |config|
26
+ # rspec-expectations config goes here. You can use an alternate
27
+ # assertion/expectation library such as wrong or the stdlib/minitest
28
+ # assertions if you prefer.
29
+ config.expect_with :rspec do |expectations|
30
+ # This option will default to `true` in RSpec 4. It makes the `description`
31
+ # and `failure_message` of custom matchers include text for helper methods
32
+ # defined using `chain`, e.g.:
33
+ # be_bigger_than(2).and_smaller_than(4).description
34
+ # # => "be bigger than 2 and smaller than 4"
35
+ # ...rather than:
36
+ # # => "be bigger than 2"
37
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
38
+ end
39
+
40
+ # rspec-mocks config goes here. You can use an alternate test double
41
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
42
+ config.mock_with :rspec do |mocks|
43
+ # Prevents you from mocking or stubbing a method that does not exist on
44
+ # a real object. This is generally recommended, and will default to
45
+ # `true` in RSpec 4.
46
+ mocks.verify_partial_doubles = true
47
+ end
48
+
49
+ # The settings below are suggested to provide a good initial experience
50
+ # with RSpec, but feel free to customize to your heart's content.
51
+ =begin
52
+ # These two settings work together to allow you to limit a spec run
53
+ # to individual examples or groups you care about by tagging them with
54
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
55
+ # get run.
56
+ config.filter_run :focus
57
+ config.run_all_when_everything_filtered = true
58
+
59
+ # Limits the available syntax to the non-monkey patched syntax that is
60
+ # recommended. For more details, see:
61
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
62
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
63
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
64
+ config.disable_monkey_patching!
65
+
66
+ # This setting enables warnings. It's recommended, but in some cases may
67
+ # be too noisy due to issues in dependencies.
68
+ config.warnings = true
69
+
70
+ # Many RSpec users commonly either run the entire suite or an individual
71
+ # file, and it's useful to allow more verbose output when running an
72
+ # individual spec file.
73
+ if config.files_to_run.one?
74
+ # Use the documentation formatter for detailed output,
75
+ # unless a formatter has already been configured
76
+ # (e.g. via a command-line flag).
77
+ config.default_formatter = 'doc'
78
+ end
79
+
80
+ # Print the 10 slowest examples and example groups at the
81
+ # end of the spec run, to help surface which specs are running
82
+ # particularly slow.
83
+ config.profile_examples = 10
84
+
85
+ # Run specs in random order to surface order dependencies. If you find an
86
+ # order dependency and want to debug it, you can fix the order by providing
87
+ # the seed, which is printed after each run.
88
+ # --seed 1234
89
+ config.order = :random
90
+
91
+ # Seed global randomization in this process using the `--seed` CLI option.
92
+ # Setting this allows you to use `--seed` to deterministically reproduce
93
+ # test failures related to randomization by passing the same `--seed` value
94
+ # as the one that triggered the failure.
95
+ Kernel.srand config.seed
96
+ =end
97
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: readypulse
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Chad Metcalf
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-its
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-collection_matchers
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Readypulse API wrapper.
98
+ email:
99
+ - cmetcalf@nerdery.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".ruby-version"
107
+ - Gemfile
108
+ - LICENSE
109
+ - LICENSE.txt
110
+ - README.md
111
+ - Rakefile
112
+ - docs/json_schema.md
113
+ - lib/readypulse.rb
114
+ - lib/readypulse/album.rb
115
+ - lib/readypulse/client.rb
116
+ - lib/readypulse/image.rb
117
+ - lib/readypulse/image_collection.rb
118
+ - lib/readypulse/image_type.rb
119
+ - lib/readypulse/version.rb
120
+ - readypulse.gemspec
121
+ - spec/lib/readypulse/album_spec.rb
122
+ - spec/lib/readypulse/client_spec.rb
123
+ - spec/lib/readypulse/image_collection_spec.rb
124
+ - spec/lib/readypulse/image_spec.rb
125
+ - spec/lib/readypulse/image_type_spec.rb
126
+ - spec/spec_helper.rb
127
+ homepage: ''
128
+ licenses:
129
+ - MIT
130
+ metadata: {}
131
+ post_install_message:
132
+ rdoc_options: []
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ requirements: []
146
+ rubyforge_project:
147
+ rubygems_version: 2.4.3
148
+ signing_key:
149
+ specification_version: 4
150
+ summary: Readypulse API wrapper.
151
+ test_files:
152
+ - spec/lib/readypulse/album_spec.rb
153
+ - spec/lib/readypulse/client_spec.rb
154
+ - spec/lib/readypulse/image_collection_spec.rb
155
+ - spec/lib/readypulse/image_spec.rb
156
+ - spec/lib/readypulse/image_type_spec.rb
157
+ - spec/spec_helper.rb