hypem 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/hypem.gemspec +3 -1
  2. data/lib/hypem.rb +2 -0
  3. data/lib/hypem/blog.rb +9 -22
  4. data/lib/hypem/helper.rb +37 -0
  5. data/lib/hypem/playlist.rb +12 -16
  6. data/lib/hypem/request.rb +14 -18
  7. data/lib/hypem/track.rb +19 -28
  8. data/lib/hypem/user.rb +26 -35
  9. data/lib/hypem/version.rb +1 -1
  10. data/spec/blog_spec.rb +5 -11
  11. data/spec/fixtures/vcr_cassettes/blog.yml +44 -0
  12. data/{fixtures → spec/fixtures}/vcr_cassettes/blog_all.yml +98 -143
  13. data/spec/fixtures/vcr_cassettes/latest_playlist.yml +238 -0
  14. data/spec/fixtures/vcr_cassettes/single_track.yml +48 -0
  15. data/spec/fixtures/vcr_cassettes/user_favorite_blogs.yml +68 -0
  16. data/spec/fixtures/vcr_cassettes/user_friends.yml +46 -0
  17. data/spec/fixtures/vcr_cassettes/user_profile.yml +46 -0
  18. data/spec/playlist_spec.rb +2 -8
  19. data/spec/request_spec.rb +0 -28
  20. data/spec/spec_helper.rb +3 -3
  21. data/spec/track_spec.rb +2 -5
  22. data/spec/user_spec.rb +5 -5
  23. metadata +53 -33
  24. data/fixtures/vcr_cassettes/blog.yml +0 -42
  25. data/fixtures/vcr_cassettes/blog_playlist.yml +0 -156
  26. data/fixtures/vcr_cassettes/feed_playlist.yml +0 -150
  27. data/fixtures/vcr_cassettes/fresh_playlist.yml +0 -230
  28. data/fixtures/vcr_cassettes/friends_history.yml +0 -144
  29. data/fixtures/vcr_cassettes/friends_playlist.yml +0 -150
  30. data/fixtures/vcr_cassettes/latest_playlist.yml +0 -216
  31. data/fixtures/vcr_cassettes/loved_playlist.yml +0 -146
  32. data/fixtures/vcr_cassettes/obsessed_playlist.yml +0 -151
  33. data/fixtures/vcr_cassettes/popular_playlist.yml +0 -167
  34. data/fixtures/vcr_cassettes/single_track.yml +0 -47
  35. data/fixtures/vcr_cassettes/user_favorite_blogs.yml +0 -61
  36. data/fixtures/vcr_cassettes/user_friends.yml +0 -44
  37. data/fixtures/vcr_cassettes/user_profile.yml +0 -44
  38. data/spec/response_spec.rb +0 -36
@@ -20,8 +20,10 @@ Gem::Specification.new do |s|
20
20
 
21
21
  s.add_development_dependency "rspec", "~> 2.6"
22
22
  s.add_development_dependency "vcr", "~> 2.0"
23
+ s.add_development_dependency "webmock"
23
24
  s.add_development_dependency "rake"
24
- s.add_dependency 'faraday', '~> 0.7'
25
+ s.add_dependency 'httparty'
26
+ s.add_dependency 'andand'
25
27
  s.add_dependency 'multi_json', '~> 1.1'
26
28
 
27
29
  end
@@ -1,3 +1,5 @@
1
+ require "andand"
2
+ require "hypem/helper"
1
3
  require "hypem/response"
2
4
  require "hypem/request"
3
5
  require "hypem/user"
@@ -1,9 +1,14 @@
1
1
  module Hypem
2
2
  class Blog
3
+ include Helper
4
+
3
5
  attr_reader :blog_image, :blog_image_small, :first_posted,
4
6
  :followers, :last_posted, :site_name, :site_url,
5
7
  :total_tracks, :id
6
8
 
9
+ convert_keys(siteid: :id, sitename: :site_name, siteurl: :site_url)
10
+ convert_datetimes(:first_posted, :last_posted)
11
+
7
12
  def initialize(*args)
8
13
  if args.count == 1
9
14
  @id = args.first.is_a?(Integer) ? args.first : args.first.to_i
@@ -11,31 +16,13 @@ module Hypem
11
16
  end
12
17
 
13
18
  def get_info
14
- unless @has_info
15
- response = Request.new("/api/get_site_info?siteid=#{@id}").tap(&:get).response.body
16
- update_from_response(response)
17
- @has_info = true
18
- end
19
- end
20
-
21
- def update_from_response(rsp)
22
- @id ||= rsp[:site_id]
23
- @blog_image ||= rsp['blog_image']
24
- @blog_image_small ||= rsp['blog_image_small']
25
- @followers ||= rsp['followers']
26
- @id ||= rsp['siteid']
27
- @site_name ||= rsp['sitename']
28
- @site_url ||= rsp['siteurl']
29
- @total_tracks ||= rsp['total_tracks']
30
-
31
- # only from get_info
32
- @first_posted ||= Time.at(rsp['first_posted']) unless rsp['first_posted'].nil?
33
- @last_posted ||= Time.at(rsp['last_posted']) unless rsp['last_posted'].nil?
34
-
19
+ response = Request.get_resource("/get_site_info?siteid=#{id}")
20
+ update_from_response(response)
21
+ self
35
22
  end
36
23
 
37
24
  def self.all
38
- response = Request.new("/api/get_all_blogs").tap(&:get).response.body
25
+ response = Request.get_resource("/get_all_blogs")
39
26
  response.map { |b| self.new.tap {|blog| blog.update_from_response(b) } }
40
27
  end
41
28
  end
@@ -0,0 +1,37 @@
1
+ module Hypem
2
+ module Helper
3
+
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ def update_from_response(raw_hash)
9
+ raw_hash.each_pair do |key,value|
10
+ key = key.to_sym
11
+ new_key = self.class.key_conversions[key]
12
+ key = new_key unless new_key.nil?
13
+
14
+ if self.class.datetime_conversions.andand.include? key
15
+ value = Time.at(value).to_datetime
16
+ end
17
+
18
+ instance_variable_set("@#{key}",value)
19
+
20
+ self.class.class_eval { attr_reader key }
21
+ end
22
+ end
23
+
24
+ module ClassMethods
25
+ attr_reader :key_conversions, :datetime_conversions
26
+
27
+ def convert_keys(values)
28
+ @key_conversions = values
29
+ end
30
+
31
+ def convert_datetimes(*values)
32
+ @datetime_conversions = values
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -9,30 +9,26 @@ module Hypem
9
9
  @type = type
10
10
  @arg = arg
11
11
  @page = page
12
- @path = "/playlist/#{@type}/#{@arg}/json/#{@page}"
12
+ @path = "/playlist/#{@type}/#{@arg}"
13
13
  end
14
14
 
15
15
  def get
16
- response = Request.new(@path).tap(&:get).response
17
- @tracks = []
18
- response.body.shift # getting rid of version cell
19
- response.body.each_value{|v| @tracks << Track.new(v)}
16
+ response = Request.get_data(path)
17
+ @tracks ||= []
18
+ response.each{|v| tracks << Track.new(v)}
19
+ self
20
20
  end
21
21
 
22
22
  def next_page
23
- Playlist.new(@type,@arg,@page+1).tap(&:get)
23
+ Playlist.new(@type,@arg,@page+1).get
24
24
  end
25
25
 
26
26
  def prev_page
27
- Playlist.new(@type,@arg,@page-1).tap(&:get)
27
+ Playlist.new(@type,@arg,@page-1).get
28
28
  end
29
29
 
30
30
  def page(num)
31
- Playlist.new(@type,@arg,num).tap(&:get)
32
- end
33
-
34
- def url
35
- Hypem::ROOT_PATH + path
31
+ Playlist.new(@type,@arg,num).get
36
32
  end
37
33
 
38
34
  def self.new_from_tracks(tracks)
@@ -42,7 +38,7 @@ module Hypem
42
38
 
43
39
  def self.latest(filter=:all,page=nil)
44
40
  raise ArgumentError unless [:all, :noremix, :remix, :fresh].include? filter
45
- Playlist.new(:latest,filter,page).tap(&:get)
41
+ Playlist.new(:latest,filter,page).get
46
42
  end
47
43
 
48
44
  def self.popular(arg=POPULAR_ARGS.first,page=nil)
@@ -52,11 +48,11 @@ module Hypem
52
48
  end
53
49
 
54
50
  def self.friends_history(user,page=nil)
55
- Playlist.new(:people_history,user,page).tap(&:get)
51
+ Playlist.new(:people_history,user,page)
56
52
  end
57
53
 
58
54
  def self.friends_favorites(user,page=nil)
59
- Playlist.new(:people,user,page).tap(&:get)
55
+ Playlist.new(:people,user,page)
60
56
  end
61
57
 
62
58
  def self.tags(list,page)
@@ -69,7 +65,7 @@ module Hypem
69
65
  # meta method definitions for generic playlists
70
66
  GENERIC_METHODS.each do |method|
71
67
  define_singleton_method(method) do |arg,page=nil|
72
- Playlist.new(method,arg,page).tap(&:get)
68
+ Playlist.new(method,arg,page)
73
69
  end
74
70
  end
75
71
 
@@ -1,29 +1,25 @@
1
- require 'faraday'
1
+ require 'httparty'
2
2
 
3
3
  module Hypem
4
- ROOT_PATH = 'http://hypem.com'
5
4
  class Request
6
- attr_reader :url
5
+ include HTTParty
7
6
 
8
- def initialize(url)
9
- @url = url
10
- end
7
+ debug_output
8
+ base_uri 'http://api.hypem.com'
9
+ headers 'Accept' => 'text/html'
10
+ format :json
11
11
 
12
- def get
13
- @raw_response = connection.get(@url)
12
+ def self.get_resource(path, query=nil)
13
+ get('/api' + path, query: query)
14
14
  end
15
15
 
16
- def response
17
- @response ||= Response.new(@raw_response)
16
+ def self.get_data(path, page=1)
17
+ url = [path, 'json', page].join('/')
18
+ response = get(url)
19
+ response.delete("version")
20
+ values = response.values
21
+ values.size == 1 ? values.first : values
18
22
  end
19
23
 
20
- private
21
-
22
- def connection
23
- @@conn ||= Faraday.new(url: ROOT_PATH) do |builder|
24
- builder.request :url_encoded
25
- builder.adapter :net_http
26
- end
27
- end
28
24
  end
29
25
  end
@@ -1,22 +1,10 @@
1
1
  module Hypem
2
2
  class Track
3
- attr_accessor :media_id
3
+ include Helper
4
4
 
5
- def initialize(arg)
6
- if arg.is_a? Hash
7
- keys_to_attributes arg
8
- elsif arg.is_a? String
9
- @media_id = arg
10
- end
11
- end
12
-
13
- def get
14
- request = Request.new("/playlist/item/#{media_id}/json/1").tap(&:get)
15
- raw_hash = request.response.body.tap(&:shift)["0"]
16
- keys_to_attributes raw_hash
17
- end
5
+ attr_accessor :media_id
18
6
 
19
- KEY_CONVERSIONS = {
7
+ convert_keys(
20
8
  mediaid: :media_id,
21
9
  dateposted: :dated_posted,
22
10
  siteid: :site_id,
@@ -29,23 +17,26 @@ module Hypem
29
17
  sitename: :site_name,
30
18
  dateposted: :date_posted,
31
19
  sitename_first: :site_name_first
32
- }
20
+ )
33
21
 
34
- DATETIME_CONVERSIONS = [:date_posted, :date_posted_first]
22
+ convert_datetimes :date_posted, :date_posted_first
35
23
 
36
- private
37
-
38
- def keys_to_attributes(raw_hash)
39
- raw_hash.each_pair do |key,value|
40
- converted_key = KEY_CONVERSIONS[key.to_sym]
41
- key = converted_key unless converted_key.nil?
42
-
43
- value = Time.at(value).to_datetime if DATETIME_CONVERSIONS.include? key
44
- instance_variable_set("@#{key}",value)
45
-
46
- self.class.class_eval { attr_reader key }
24
+ def initialize(arg)
25
+ if arg.is_a? Hash
26
+ update_from_response arg
27
+ elsif arg.is_a? String
28
+ @media_id = arg
29
+ else
30
+ raise
47
31
  end
48
32
  end
49
33
 
34
+ def get
35
+ response = Request.get_data("/playlist/item/#{media_id}")
36
+ update_from_response response
37
+ self
38
+ end
39
+
40
+
50
41
  end
51
42
  end
@@ -1,5 +1,10 @@
1
1
  module Hypem
2
2
  class User
3
+ include Helper
4
+
5
+ convert_keys fullname: :full_name, userpic: :image_url, joined_ts: :joined_at
6
+ convert_datetimes :joined_at
7
+
3
8
  attr_reader :name, :full_name, :joined_at, :location, :twitter_username, :image_url,
4
9
  :followed_users_count, :followed_items_count, :followed_sites_count,
5
10
  :followed_queries_count, :friends
@@ -9,23 +14,19 @@ module Hypem
9
14
  @name = name
10
15
  end
11
16
 
12
- def api_request(path)
13
- request = Request.new("/api/#{path}?username=#{@name}")
14
- request.get
15
- request.response.body
17
+ def get(resource)
18
+ Request.get_resource("#{resource}?username=#{@name}")
16
19
  end
17
20
 
18
21
  def get_profile
19
- unless @has_profile
20
- response = api_request('get_profile')
21
- update_from_response(response)
22
- @has_profile = true
23
- end
24
- return self
22
+ response = get('/get_profile')
23
+ flattened_response = flatten_response(response)
24
+ update_from_response(response)
25
+ self
25
26
  end
26
27
 
27
- def get_favorite_blogs
28
- response = api_request('get_favorite_blogs')
28
+ def favorite_blogs
29
+ response = get('/get_favorite_blogs')
29
30
 
30
31
  response.map do |r|
31
32
  blog = Hypem::Blog.new(r['siteid'])
@@ -34,12 +35,8 @@ module Hypem
34
35
  end
35
36
  end
36
37
 
37
- def favorite_blogs
38
- @favorite_blogs ||= get_favorite_blogs
39
- end
40
-
41
- def get_friends
42
- response = api_request('get_friends')
38
+ def friends
39
+ response = get('/get_friends')
43
40
 
44
41
  response.map do |r|
45
42
  user = User.new(r['username'])
@@ -48,23 +45,6 @@ module Hypem
48
45
  end
49
46
  end
50
47
 
51
- def friends
52
- @friends ||= get_friends
53
- end
54
-
55
- def update_from_response(response)
56
- @full_name ||= response['fullname']
57
- @location ||= response['location']
58
- @image_url ||= response['userpic']
59
- @followed_users_count ||= response['favorites_count']['user']
60
- @followed_items_count ||= response['favorites_count']['item']
61
- @followed_sites_count ||= response['favorites_count']['site']
62
- @followed_queries_count ||= response['favorites_count']['query']
63
-
64
- # only returned on get_profile
65
- @joined_at ||= Time.at(response['joined_ts']) unless response['joined_ts'].nil?
66
- @twitter_username ||= response['twitter_username']
67
- end
68
48
 
69
49
  #playlist requests
70
50
 
@@ -87,5 +67,16 @@ module Hypem
87
67
  def friends_history_playlist(page=1)
88
68
  @f_h_p ||= Playlist.friends_history(@name,page)
89
69
  end
70
+
71
+ private
72
+
73
+ def flatten_response(response)
74
+ count_hash = response.delete('favorites_count')
75
+ count_hash.each do |k,v|
76
+ pluralized_key = k == 'query' ? 'queries' : k + 's'
77
+ response["followed_#{pluralized_key}_count"] = v
78
+ end
79
+ response
80
+ end
90
81
  end
91
82
  end
@@ -1,3 +1,3 @@
1
1
  module Hypem
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -14,23 +14,17 @@ describe Hypem::Blog do
14
14
 
15
15
  describe "#get_info" do
16
16
  subject do
17
- VCR.use_cassette('blog') {blog.tap(&:get_info)}
17
+ VCR.use_cassette('blog') {blog.get_info}
18
18
  end
19
19
  specify {subject.should be_a Hypem::Blog}
20
20
  specify {subject.site_name.should == 'Pasta Primavera'}
21
21
  specify {subject.blog_image.should == 'http://static-ak.hypem.net/images/blog_images/4632.jpg'}
22
22
  specify {subject.blog_image_small.should == 'http://static-ak.hypem.net/images/blog_images/small/4632.jpg'}
23
23
  specify {subject.site_url.should == 'http://pastaprima.net'}
24
- specify {subject.total_tracks.should == 4026}
25
- specify {subject.first_posted.should be_a Time}
26
- specify {subject.last_posted.should be_a Time}
27
- specify {subject.followers.should == 1345}
28
-
29
- it "caches its response" do
30
- subject
31
- Hypem::Request.should_not_receive :new
32
- VCR.use_cassette('blog') { blog.get_info }
33
- end
24
+ specify {subject.total_tracks.should be_an Integer}
25
+ specify {subject.first_posted.should be_a DateTime}
26
+ specify {subject.last_posted.should be_a DateTime}
27
+ specify {subject.followers.should be_an Integer}
34
28
 
35
29
  end
36
30
 
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://api.hypem.com/api/get_site_info?siteid=4632
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - text/html
12
+ response:
13
+ status:
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ Server:
18
+ - nginx/1.0.12
19
+ Date:
20
+ - Tue, 26 Jun 2012 02:52:09 GMT
21
+ Content-Type:
22
+ - text/html
23
+ Transfer-Encoding:
24
+ - chunked
25
+ Connection:
26
+ - keep-alive
27
+ Keep-Alive:
28
+ - timeout=10
29
+ Set-Cookie:
30
+ - AUTH=03%3Af1682d84385b013d5d5ddb49ad4b6aba%3A1340679128%3A1276002699%3ACA-US;
31
+ expires=Thu, 22-Jun-2028 02:52:08 GMT; path=/; domain=hypem.com
32
+ X-Hacker:
33
+ - Hey, if you're reading this, you should drop us an email at hypem.com/contact,
34
+ maybe we can work together!
35
+ Access-Control-Allow-Origin:
36
+ - ! '*'
37
+ Access-Control-Allow-Headers:
38
+ - ! '*'
39
+ body:
40
+ encoding: US-ASCII
41
+ string: ! '{"siteid":"4632","sitename":"Pasta Primavera","siteurl":"http:\/\/pastaprima.net","followers":1359,"is_favorite":null,"total_tracks":4104,"last_posted":1340641909,"first_posted":1192804200,"blog_image":"http:\/\/static-ak.hypem.net\/images\/blog_images\/4632.jpg","blog_image_small":"http:\/\/static-ak.hypem.net\/images\/blog_images\/small\/4632.jpg"}'
42
+ http_version:
43
+ recorded_at: Tue, 26 Jun 2012 02:52:38 GMT
44
+ recorded_with: VCR 2.2.0